React/React Native:子组件状态的变化会重新渲染整个组件

Posted

技术标签:

【中文标题】React/React Native:子组件状态的变化会重新渲染整个组件【英文标题】:React/React Native: Changes in a child component's state re-render entire components 【发布时间】:2021-09-20 07:56:25 【问题描述】:

下面是组件代码的简单表示:

/*
All the necessary imports
*/


export default function ParentComponent() 
    const [parentState, setParentState] = useState(null);
    const username, setUsername = useContext(Username);

    const route = useRoute();
    const navigation = useNavigation();

    useEffect(()=>
        //Logic to call setParentstate based on query results;
    )

    const FirstComponent = () => 
        const [firstState, setFirstState] = useState(null);

        useEffect(()=>
            //Logic to call setFirststate based on query results;
        ,[])
    
        return (
            <View>
               <Text>firstState</Text>
            </View>
        )
    ;

    const SecondComponent = () => 
        const [secondState, setSecondState] = useState(0);
        const number, setNumber = useContext(Number);

        useEffect(()=>
            //Logic to call setSecondstate and setNumber based on query results;
        ,[])
    
        const updateState = () => 
            setSecondState(secondState + 1);
            setNumber(secondState + 1);
        ;
    
        return (
            <View>
               <Text>secondState</Text>
               <TouchableOpacity onPress=updateState>
                   <Text>Update</Text>
               </TouchableOpacity>
            </View>
        );
    ;

    return (
    <View>
        <Text>username</Text>
        <Text>parentState</Text>
        <FirstComponent />
        <SecondComponent />
    </View>
    );

有一个功能可以更新状态并将更改反映在 SecondComponent 上。由于我没有更改 ParentComponent 的状态,因此这不应触发 ParentComponent 的重新渲染。但是,当 secondState 更新时,所有组件都会重新渲染。

我很困惑,因为子组件状态的更新不应该触发父组件的重新渲染,但这一直在发生。

我怀疑这与父组件中的钩子或使用 Context API 有关,但不确定。

谁能帮我找出可能导致此问题的原因,以及我应该如何解决它?

非常感谢!

【问题讨论】:

无论您肯定不想在 ParentComponent 的主体中定义 FirstComponentSecondComponent 的任何其他问题,因为任何时候 ParentComponent 重新渲染,然后子组件将被重新声明,以前的组件将卸载并安装新的组件。 我将您的代码复制/粘贴到正在运行的 codesandbox 中,但我不会重现您描述的问题。我确实必须注释掉上下文代码,因为你没有提供它。您能否更新您的问题以包含所有相关代码? 我认为在ParentComponent 之外定义FirstComponentSecondComponent 将解决您的问题。 【参考方案1】:

我看到了一个类似的问题,它通过为每个文件定义一个组件来解决。

【讨论】:

以上是关于React/React Native:子组件状态的变化会重新渲染整个组件的主要内容,如果未能解决你的问题,请参考以下文章

相机状态就绪时的 React-native-camera flash 权限视图

如何在组件 React / React-native 的单独页面中使用动态 graphql(字符串)

我应该在 React/React Native 组件的啥地方放置一个函数?我看到三个选项

错误:无效的挂钩调用。钩子只能在函数组件的主体内部调用。 (React-hooks React-native)

使用带有样式组件和主题的 react-test-renderer (React Native)

react native 布局注意点