【问题标题】:Call a 'helper' function from another component in React Native?从 React Native 中的另一个组件调用“帮助器”函数?
【发布时间】:2020-08-13 12:11:05
【问题描述】:

很抱歉,我发现 React Native 令人困惑和令人费解。我将下面的代码用作“帮助程序”脚本来保存可由单独组件访问的对象值。

LogContext.js

import React, { useState } from 'react'

export const LogContext = React.createContext({
  set: "en",
  login: "false",
  setLog: () => {},
});

export const LogContextProvider = (props) => {

  const setLog = (login) => {
    setState({set: "jp", login: login, setLog});
  };

  const initState = {
    set: "en",
    login: "false",
    setLog,
  };

  const [state, setState] = useState(initState);

  return (
    <LogContext.Provider value={state}>
      {props.children}
    </LogContext.Provider>
  );
};

我的问题是能够从另一个组件调用“setLog”以更改“状态”对象的值。例如:

AnyOtherComponent.js

import React, { useState, useContext, createContext } from 'react'
import { Button, TouchableOpacity, Text } from 'react-native'
import { Actions } from 'react-native-router-flux'

import { LogContextProvider, LogContext } from './LogContext'

const AnyOtherComponent = (props) => {
  const status = useContext(LogContext);
  //status.setLog('true');  //also tried to call the 'update' here...

  const goToHome = () => {
  status.setLog('true');  //call doesn't update object values here either...
  Actions.home()
  }

   return (
   <>
     <Text>This is Proceed</Text>
     <Text>Passed SET: {JSON.stringify(status.set)}</Text>
     <Text>Passed LOGIN: {JSON.stringify(status.login)}</Text>
     <Button title="Update" onPress={goToHome} />
   </>
   )
}
export default AnyOtherComponent

Home.js

import React, { useState, useContext, createContext } from 'react'
import { Button, TouchableOpacity, Text } from 'react-native';
import { Actions } from 'react-native-router-flux';

import { LogContextProvider, LogContext } from './LogContext'

const Home = () => {
const status = useContext(LogContext);

   const goToAbout = () => {
      Actions.about()
   }
   const goToLogin = () => {
      Actions.login()
   }

   return (
     <LogContext.Provider value={status}>
      <TouchableOpacity style = {{ margin: 128 }} onPress = {goToAbout}>
         <Text>This is HOME!</Text>
         <Text>Passed SET: {JSON.stringify(status.set)}</Text>
         <Text>Passed LOGIN: {JSON.stringify(status.login)}</Text>
      </TouchableOpacity>
      {status.login === 'false' ? (
        <Button
          title="Go to Login"
          onPress={goToLogin}
        />
      ) : (
        <Button
          title="BroadCast"
          onPress={() => Actions.BroadCast()}
        />
      )}
     </LogContext.Provider>
   )
}
export default Home

我也尝试使用“useEffect”但没有成功(如注释掉的行中所示)。在这种情况下,错误似乎与我正在使用的导航有关(React-Native-Router-Flux)。非常感谢任何建议。

【问题讨论】:

    标签: react-native helper react-native-router-flux


    【解决方案1】:

    您需要定义在创建 de Context 时更改状态的函数。 确保传递给 createContext 的默认值的形状与消费者期望的形状相匹配!

    export const LogContext = React.createContext({
      set: "en",
      login: "false",
      setLog: () => {},
    });
    

    State 还包含更新函数,因此它将被传递到上下文提供程序!

    export const LogContextProvider = (props) => {
      const setLog = (login) => {
        setState({ set: "jp", login: login, setLog });
      };
    
      const initState = {
        set: "en",
        login: "false",
        setLog,
      };
      const [state, setState] = useState(initState);
    
      return (
        <LogContext.Provider value={state}>{props.children}</LogContext.Provider>
      );
    };
    

    要使用上下文,您可以使用 Context.Consumer 或 useContext 挂钩。

    // with Context.Consumer
    <LogContext.Consumer>
      {status => <Button onPress={() => status.setLog(true)} />}
    </LogContext.Consumer>
    
    //with useContext
    const status = useContext(LogContext);
    <Button onPress={() => status.setLog(true)} />
    

    有关更多详细信息,React 的文档中有一个很好的 how to updating Context from a component 示例。

    【讨论】:

    • 感谢您的回复,非常感谢。如何从另一个组件调用“setLog”...?我应该像在我的示例中那样使用“status.setLog({'true'})”吗?再次感谢。
    • 查看您提供的链接,看来我需要使用包含在我的“返回”中的“消费者”来调用。在需要更改对象值的组件中..正确吗?
    • 您可以同时使用 Context.Consumer 和 useContext 挂钩。我用例子更新了答案。
    • 感谢您的帮助,我会在明天可能的时候尝试一下。最后一个问题,如果可以的话……我可以在不使用带有按钮的“onPress”的情况下调用该函数吗?我想在没有用户干预的情况下调用更新对象值......如果可能......?问候。
    • “setLog”也不应该带参数传递...?例如“status.setLog('true')”而不是“status.setLog”...?
    猜你喜欢
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 2019-03-24
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多