React Native - 在消费者中更新上下文仅在第一次工作

Posted

技术标签:

【中文标题】React Native - 在消费者中更新上下文仅在第一次工作【英文标题】:React Native - Update Context in Consumer only works first time 【发布时间】:2021-03-05 08:54:14 【问题描述】:

我正在尝试更新一个上下文,如消费者内部按钮点击中的计数器,它是第一次工作(增量 +1),但在第一次点击后,按钮似乎无法再次点击。

UserContext.js

import React from 'react'; import  createContext, useState  from "react";


export const UserContext = createContext();

const UserProvider = (children) => 
    
    const [context, setContext] = useState(count : 1,   update: () => 
        setContext((context) => (
            count: context.count + 1
        ));
    );


    return(
        <UserContext.Provider value=context>
            children
        </UserContext.Provider>
    );




export default UserProvider;

index.js

import React, useEffect, useState, useContext  from 'react';
import ScrollView, Text, View , Button, StyleSheet, ActivityIndicator from 'react-native';
import Colors from 'react-native/Libraries/NewAppScreen';
import  UserContext  from '../userContext.js';


export default Home = (navigation) => 

  return (
    <View style=styles.body>

      <UserContext.Consumer>
      (count, update) => ( 
      <View>
        <Button
            onPress=update
            title="Counter">
          </Button>
          
        <Text>count</Text>
      </View>
      )
    </UserContext.Consumer>
    
    </View>

  );
;

【问题讨论】:

您的代码是错误的,因为当您设置上下文时,您删除了更新功能。看我的回答 【参考方案1】:

如何定义和使用上下文

const UserProvider = (children) => 
    
    const [context, setContext] = useState(1)   

    //create a update function that setContext
    const update = () => 
       setContext(prev => prev+1);
    


    return(
        <UserContext.Provider value= context, update >
            children
        </UserContext.Provider>
    );



在您的 index.js

export default Home = (navigation) => 

  return (
     /* wrap your app in the provider */
    <UserProvider>
         <App />
    </UserProvider>

  );
;


//App Component
const App = () => 

     const  context, update  = useContext(UserContext)
     return (<View>
              <Button onPress=update title="Counter">Add Counter</Button>
             <Text>context</Text>
             </View>)

【讨论】:

它的工作。我认为我应该使用消费者,为什么不使用它? 你可以。您的代码不起作用的原因是因为当您更新时,您删除了更新功能。其次,由于你使用函数式组件,所以学习使用钩子是一个好习惯。它干净实用。 你检查你的更新功能,它只设置计数。

以上是关于React Native - 在消费者中更新上下文仅在第一次工作的主要内容,如果未能解决你的问题,请参考以下文章

状态更改后,上下文未更新 React Native 中的文本

如何在 react-native-webview 中启用安全上下文?

React (Native) Context API 导致 Stack Navigator (React Navigation 5) 在状态更新后重新渲染

React 上下文需要 2 次状态更新才能让消费者重新渲染

React Context 未将类更新为值

从消费者 componentDidMount 更新反应上下文会导致无限重新渲染