我有以下父组件和子组件:

function Child({initialValues, onChange}) {

    const [count, setCount] = useState(0);
    const [values, setValues] = useState([]);

    const handleChange = () => {
      const next = count + 1;
      const curr = [...values];
      curr.push(next);
      setValues(curr);
      setCount(next);
    };

    useEffect(() => {
      onChange(values);
    }, [values]);

    useEffect(() => {
      const curr = [...values];
      initialValues.forEach(x => {
        curr.push(x);
      });
      setValues(curr);
    }, [initialValues]);


    return (
      <View>
        {values.map(v => <Text key={v}>{v}</Text>)}
        <Button onPress={handleChange}>Add</Button>
      </View>
    );
}



function Parent() {

    const [childState, setChildState] = useState([]);

    const handleMasterChange = (values) => {
      setChildState(values);
    };

    return (
      <Child initialValues={[4, 5]} onChange={handleMasterChange} />
    );
}

出于某种原因,当我在父组件中设置子状态时,它会导致无限的桶.

如果我删除父组件上的setChildState(Values)函数,它就能正常工作. 另外,如果我删除子组件上的InitialValues useEffect,它也可以正常工作. 问题是我两者都需要. 有什么主意吗?还有什么 Select 可以让它工作得很好吗?

推荐答案

该问题是由于将initialValues={[4, 5]}作为内联属性发送而导致的无限循环.我能够在我这边重现这个问题.它是通过使用useMemo记录该值来解决的.请如下所示更改父组件.

function Parent() {
  const [childState, setChildState] = useState([]);

  const initialValues = useMemo(() => [4, 5], []);

  const handleMasterChange = (values) => {
    setChildState(values);
  };

  return <Child initialValues={initialValues} onChange={handleMasterChange} />;
}
 

Reactjs相关问答推荐

导致类型错误的调度不是函数";

CreateBrowserRouter将props 传递给父组件以验证权限

蚂蚁 Select .列表弹出窗口不会';有时不会出现

滚动视图样式高度没有任何区别

React 错误无法读取未定义的属性(读取id)#react

找不到名称setCometChat

无法使用react-hook-form和react-places-autocomplete在字段中输入值

获取更多数据后更新 DOM,而不刷新 React.js 中的页面

Syncfusion:带有 TabItemsDirective 的选项卡组件不显示任何内容

无法通过react 路由中的链接传递信息

无法从子组件传递数据到父组件

在遵循 react-navigation 的官方文档时收到警告消息

在 Nextjs13 应用程序目录中呈现从 supabase 获取的数据

使用 react pro 侧边栏展开折叠菜单

我收到Uncaught TypeError: props.handleSelect is not a function

从服务器获取数据时未定义,错误非法调用

来自一个自定义 React Native 组件的样式从另一个自定义组件移除样式

如何在 v6.4 中将 Auth0 提供程序与新的 createBrowsereRouter 一起使用?

react 路由路由加载器不适用于嵌套组件

在react 路由dom版本6中的组件内添加路由