如何使用 Context 和 Hooks 切换布尔值?

Posted

技术标签:

【中文标题】如何使用 Context 和 Hooks 切换布尔值?【英文标题】:How to toggle a boolean value using Context and Hooks? 【发布时间】:2020-01-07 05:27:49 【问题描述】:

我正在使用ReactContextHooks 在单击按钮时显示和隐藏Modal

以下是我的上下文代码

const setPrivacyPolicyModalVisibility = dispatch => 
  return (visible) => 
    visible
      ? dispatch(type: 'enablePrivacyPolicyModalVisibility')
      : dispatch(type: 'disablePrivacyPolicyModalVisibility');
  ;
;

相同的reducer代码如下

case 'enablePrivacyPolicyModalVisibility':
      return ...state, ...enablePrivacyPolicy: true;
case 'disablePrivacyPolicyModalVisibility':
      return ...state, ...enablePrivacyPolicy: false;

我班上的一些设置代码

const state, setPrivacyPolicyModalVisibility = useContext(Context);
  const [privacyVisibility, setPrivacyVisibility] = useState(false);

点击按钮我调用以下代码

<TouchableOpacity
        onPress=() => 
          setPrivacyVisibility(true);
          console.log(`$privacyVisibility`);
          setPrivacyPolicyModalVisibility(privacyVisibility);
        .....

如您所见,我正在控制台记录 privacyVisibility 值,但它总是错误的,我无法理解

以下是我在组件中隐藏或显示模态的代码

state.enablePrivacyPolicy ? (
        <SettingsPrivacyModal visible=true />
      ) : (
        <SettingsPrivacyModal visible=false />
      )

模态代码是正确的,因为我尝试将默认值设置为 true 只是为了检查模态是否可见然后它可以工作,但是单击按钮时状态值不会改变,我无法看到模态该值始终为 false

【问题讨论】:

【参考方案1】:

问题似乎出在onPress 回调中:

onPress=() => 
    const privacyVisibility_new = !privacyVisibility;

    console.log( privacyVisibility_new );

    setPrivacyVisibility( privacyVisibility_new );
    setPrivacyPolicyModalVisibility( privacyVisibility:privacyVisibility_new );

当循环到达回调时,privacyVisibility 的默认值为false。我认为您假设一旦调用setPrivacyVisibilityprivacyVisibility 变量将在同一个周期中具有新值;但在组件再次渲染之前它不会有更新的值。


setPrivacyPolicyModalVisibility 似乎不正确。我不确定 dispatch 到底在哪里,但假设它与函数处于同一级别,您可以简单地在内部使用它。

const setPrivacyPolicyModalVisibility = visible => 
    if ( visible )             
        dispatch( type: "enablePrivacyPolicyModalVisibility" );
     else 
        dispatch( type: "disablePrivacyPolicyModalVisibility" );
    
;

您可能希望简化您的 reducer 并直接发送 visible 值:

const setPrivacyPolicyModalVisibility = visible =>
    dispatch( type: "setPrivacyPolicyModalVisibility", payload: visible );

.

case 'setPrivacyPolicyModalVisibility':
    return  ...state, is_privacyPolicy_visible: action.payload ;

【讨论】:

在 setPrivacyPolicyModalVisibility 中我找不到变量调度【参考方案2】:

其实错误很简单。我在 setPrivacyPolicyModalVisibility 中使用 visible 参数作为道具,但是在设置时我传递了不同名称的道具

感谢@Alvaro 为我指明了正确的方向

【讨论】:

以上是关于如何使用 Context 和 Hooks 切换布尔值?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 React Hooks 和 Context API 正确地将来自 useEffect 内部调用的多个端点的数据添加到状态对象?

如何使用 React Hooks 单独切换手风琴面板?

React 系列 02❤️ Custom Hooks 中使用 React Context

React 系列 02❤️ Custom Hooks 中使用 React Context

使用 React Hooks 和 Context API 更改语言

使用 React Hooks 和 Context 检查电子邮件是不是已经存在于 Firestore 的集合中