- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的回调在一次又一次调用后返回相同的状态
我是 react 类中的 react 钩子(Hook)的新手,我本可以使用 shouldcomponentupdate 并且可以解决这个问题
但是 usecallback 钩子(Hook)中没有参数
import React, {
useLayoutEffect,
useState,
useCallback,
useEffect,
} from "react";
import { StyleSheet, Text, View, Platform, YellowBox } from "react-native";
import { HeaderButtons, Item } from "react-navigation-header-buttons";
import HeaderButton from "../components/HeaderButton";
import { Switch } from "react-native-paper";
import Colors from "../constants/Colors";
//check use callback value first
YellowBox.ignoreWarnings([
"Non-serializable values were found in the navigation state",
]);
const FilterSwitch = ({ label, state, onChange }) => (
<View style={styles.filterContainer}>
<Text>{label}</Text>
<Switch
value={state}
trackColor={{ true: Colors.primaryColor }}
thumbColor={Platform.OS === "android" ? Colors.primaryColor : ""}
onValueChange={onChange}
/>
</View>
);
const FiltersScreen = ({ navigation }) => {
const [isGlutenFree, setIsGlutenFree] = useState(false);
const [isLactoseFree, setIsLactoseFree] = useState(false);
const [isVegan, setIsVegan] = useState(false);
const [isVegetarian, setIsVegetarian] = useState(false);
const saveFilters = useCallback(() => {
console.log(isGlutenFree);
const appliedFilters = {
glutenFree: isGlutenFree,
lactoseFree: isLactoseFree,
vegan: isVegan,
isVegetarian: isVegetarian,
};
console.log(appliedFilters);
}, [isGlutenFree, isLactoseFree, isVegan, isVegetarian]);
useLayoutEffect(() => {
navigation.setOptions({
headerTitle: "Filter Meals",
headerLeft: () => (
<HeaderButtons HeaderButtonComponent={HeaderButton}>
<Item
title="Menu"
iconName="ios-menu"
onPress={() => {
navigation.toggleDrawer();
}}
/>
</HeaderButtons>
),
headerRight: () => (
<HeaderButtons HeaderButtonComponent={HeaderButton}>
<Item
title="Save"
iconName="ios-save"
onPress={() => saveFilters()}
/>
</HeaderButtons>
),
});
}, [navigation]);
return (
<View style={styles.screen}>
<Text style={styles.title}>Available Filters / Restrictions</Text>
<FilterSwitch
label="Gluten Free"
state={isGlutenFree}
onChange={(newValue) => {
setIsGlutenFree(newValue);
}}
/>
<FilterSwitch
label="Lactos Free"
state={isLactoseFree}
onChange={(newValue) => setIsLactoseFree(newValue)}
/>
<FilterSwitch
label="Vegan Free"
state={isVegan}
onChange={(newValue) => setIsVegan(newValue)}
/>
<FilterSwitch
label="Vegetarian Free"
state={isVegetarian}
onChange={(newValue) => setIsVegetarian(newValue)}
/>
</View>
);
};
const styles = StyleSheet.create({
screen: {
flex: 1,
alignItems: "center",
},
filterContainer: {
flexDirection: "row",
justifyContent: "space-between",
alignItems: "center",
width: "80%",
marginVertical: 15,
},
title: {
fontFamily: "open-sans-bold",
fontSize: 22,
margin: 20,
textAlign: "center",
},
});
export default FiltersScreen;
最佳答案
您的代码的问题是,即使您提供了 useCallback
对于所有依赖数组,您只使用 first closure value
onPress={() => saveFilters()}
中的函数因为这段代码是在 useLayoutEffect
内部执行的并且仅在 navigation
上运行改变
这里的解决方案是 update navigation options
两个navigation
改变和开启saveFilters
改变
useLayoutEffect(() => {
navigation.setOptions({
headerTitle: "Filter Meals",
headerLeft: () => (
<HeaderButtons HeaderButtonComponent={HeaderButton}>
<Item
title="Menu"
iconName="ios-menu"
onPress={() => {
navigation.toggleDrawer();
}}
/>
</HeaderButtons>
),
headerRight: () => (
<HeaderButtons HeaderButtonComponent={HeaderButton}>
<Item
title="Save"
iconName="ios-save"
onPress={() => saveFilters()}
/>
</HeaderButtons>
),
});
}, [navigation, saveFilters]);
P.S. This is the kind of situation where I feel hooks implementation sometimes becomes hacky or inefficient. Also debugging
closures
is way more difficult then debuggingcontext
(this inclass component)
关于javascript - useCallback Hooks 获取旧状态值而不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61709542/
我正在优化应用程序的性能,我想知道是否对那些不依赖任何变量的函数使用 useCallback 钩子(Hook)。 考虑以下情况: 假设我们有一些功能: const someFunc = () => {
在我尝试更好地理解 React Hooks 的过程中,我遇到了一些我没有预料到的行为。我试图创建一个引用数组,并通过 onRef 函数推送到所述数组,我将传递给我的 's 。每次组件重新渲染时,数组都
我对 useMemo 还很陌生和 useCallback react 中的钩子(Hook),我有点不明白为什么即使我检查的变量保持不变,我的函数仍然继续重新渲染。目前我正在尝试构建一个谷歌地图,允许用
最近在研究react-hook。我在实践的过程中遇到了一个让我无法理解的问题。 import React, { useState, useCallback } from 'react'; const
根据 React 官方文档,如果组件新状态是使用先前状态计算的,则可以将函数传递给 setState。该函数将接收先前的值,并返回更新后的值。 考虑以下代码片段示例: const [counter,
为什么useCallback 钩子(Hook)会执行两次?我收到一条警告,建议我使用 useCallback,所以我正在尝试这样做。据我了解,useCallback 只会在我们传递给数组的对象更新时执
目前,每次更新查询参数时,我的代码都会重新呈现。一旦我删除了查询参数;但是,我收到一条警告,指出“React Hook useCallback 缺少依赖项:'query'。要么包含它,要么删除依赖项数
使用 React 的 useCallback hook 本质上只是 useMemo 的包装。专门用于函数,以避免在组件的 props 中不断创建新的函数实例。我的问题来自于当您需要将争论传递给从内存创
React 文档中关于 useMemo 的内容如下 You may rely on useMemo as a performance optimization, not as asemantic gu
在我读过的 React 文档 Pass an inline callback and an array of dependencies. useCallback will return a memoi
在我读过的 React 文档 Pass an inline callback and an array of dependencies. useCallback will return a memoi
什么时候应该使用 useCallback 什么时候应该使用简单的数组函数?或者也许我不应该使用第二种方法? const MyCompenent = (props) => { const handl
使用 React Hooks,当我们想要记住函数的创建时,我们有 useCallback 钩子(Hook)。这样我们就有了: const MyComponent = ({ dependancies }
我有接受函数作为参数的钩子(Hook)。如果功能发生不必要的更改,则可能会导致额外的重新渲染。我想确保函数用 useCallback 包装。 即这是一个简化版本: function useApi({
考虑这个带有自定义表单钩子(Hook)的基本表单字段组件来处理输入更改: import React, { useState, useCallback } from 'react'; const use
我正在检测组件中的按键,该组件知道当前通过 Prop 在应用程序的其他地方打开了什么对话框组件, currentDialog .通常我可以在嵌套函数中访问这个 Prop ,但在使用 useCallba
我正在学习 Advanced React Patterns with Hooks 在线类(class),在这个早期示例中,他们使用以下 API 创建了一个可扩展组件(比如经典的 Accordion 或
我是 React 的新手,我收到了这个错误: Warning: Can't perform a React state update on an unmounted component. This i
我的回调在一次又一次调用后返回相同的状态 我是 react 类中的 react 钩子(Hook)的新手,我本可以使用 shouldcomponentupdate 并且可以解决这个问题 但是 useca
下面的示例是一个简化的摘录,其中子组件根据鼠标行为发出事件。然后 React 应根据发出的事件更新 DOM。 function SimpleSample() { const [addons, se
我是一名优秀的程序员,十分优秀!