【发布时间】:2020-08-15 04:58:29
【问题描述】:
我有一个 Flatlist 组件,它将其状态和 setState 传递给子组件。子组件确实更改了父组件的状态(尝试使用 setinterval 和 console.log 显示状态)但是当更改发生时我无法收听。我尝试使用
useEffect(()=>{
console.log(`listState:`, state);
},[state]);
但它从不触发,除非在安装时触发。这是我的代码。
// in CheckboxFlatList.js (parent)
import React, { useState, useEffect, useRef } from 'react';
import { View, StyleSheet, Dimensions, Text } from 'react-native';
import { FlatList } from 'react-native-gesture-handler';
import CheckBox from "./Checkbox";
function CheckboxFlatList(props) {
const [state, setState] = useState([]);
useEffect(() => {
console.log(`listState:`, state);
},[state]);
// setInterval(() => {
// console.log(`listState:`, state);
// },3000 );
return (
<View>
<FlatList
data={data}
keyExtractor={item => item.id.toString()}
renderItem={({ item }) => (
<View>
<View>
<CheckBox id={item.id.toString()} listState={state} stateMerge={setState} isChecked={state.some(x => x === item.id.toString())} />
<Text>{item.name}</Text>
</View>
</View>
)}
/>
</View >
);
}
// in Checkbox.js (child)
import React, { useState, useEffect, useRef, memo } from 'react';
import { CheckBox } from 'react-native-elements';
export default memo(
function Checkbox(props) {
let { listState, stateMerge, isChecked, id } = props;
const [toggleCheckBox, setToggleCheckBox] = useState(isChecked);
const mounted = useRef();
useEffect(() => {
if (!mounted.current) { // do componentDidMount logic
mounted.current = true;
} else { // do componentDidUpdate logic
if (toggleCheckBox) {
if (!listState.some(x => x === id)) { //to avoid a duplication bug
listState.push(id);
}
} else {
while (listState.some(x => x === id)) { //to avoid a duplication bug
let index = listState.indexOf(id);
if (index !== -1) listState.splice(index, 1);
}
}
stateMerge(listState);
}
});
return (
<CheckBox checked={toggleCheckBox} size={40} onPress={() => {
setToggleCheckBox(!toggleCheckBox);
}} />
);
});
非常感谢您的帮助!
【问题讨论】:
-
所以你将一个状态和一个钩子传递给一个记忆化的组件。然后将状态(不使用他的钩子)修改为另一个钩子,使用 useRef 应用 componentDidMount 逻辑,并且有些东西不起作用...... :)
-
@Giovanni_Esposito 我几天前才开始反应原生,这就是原因。你能更详细地向我解释你提到的错误吗?这对我很有帮助。
标签: reactjs react-native