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

时间:2019-09-04 10:19:00

标签: react-native react-hooks react-context

我正在使用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值,但它始终是错误的,我无法理解

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

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

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

2 个答案:

答案 0 :(得分:0)

问题似乎出在adb回调中:

adb

当周期到达回调时,adb devices的默认值为onPress。我认为您假设一旦调用onPress={() => { const privacyVisibility_new = !privacyVisibility; console.log( privacyVisibility_new ); setPrivacyVisibility( privacyVisibility_new ); setPrivacyPolicyModalVisibility( privacyVisibility:privacyVisibility_new ); }} ,则privacyVisibility变量将在同一周期中具有新值。但是在组件再次呈现之前,它不会具有更新的值。


false似乎不正确。我不确定确切在哪里调度,但是假设它与您可以在内部简单使用的功能处于同一级别。

setPrivacyVisibility

您可能想简化减速器并直接发送privacyVisibility值:

setPrivacyPolicyModalVisibility

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

答案 1 :(得分:0)

实际上,错误很简单。我在setPrivacyPolicyModalVisibility中将visible参数用作props,但是在设置时,我正在传递不同名称的prop

感谢@Alvaro向我指出正确的方向