我对react native 0.62有一个奇怪的问题,在onChangeText中,我try 调用两个函数setData和checkEmailSyntax.我不知道为什么,但只执行第一个函数.我也看到过类似的问题,但都不管用.

此外,我对上下文也有同样的问题.当我try 在useffect中一个接一个地执行这些函数时,Context返回logout、setUser等函数,只调用最后一个函数.

您认为这是react-native 版本问题吗?或者是我的错.

好的,@Nestoro解决了这个疑问,checkEmail正在处理旧状态,没有新的邮箱,因此邮箱状态为空.新的问题是我可以改变错误的EmailSyntax状态吗?或者我必须使用useEffect,并在每次邮箱更改时将其激活?

      <TextInput
        style={styles.inputText}
        placeholder="e-mail"
        autoCompleteType="email"
        onChangeText={text => {
          setData({ ...data, input_email: text });
          checkEmailSyntax(text);
        }}
        autoCapitalize="none"
        placeholderTextColor="grey"
      />

  const checkEmailSyntax = (inputVal) => {
    if (inputVal.includes('@') && inputVal.includes('.')) {
      setData({ ...data, wrongEmailSyntax: false });
    } else {
      setData({ ...data, wrongEmailSyntax: true });
    }
  };

  const [data, setData] = useState({
    input_email: '',
    input_password: '',
    wrongEmailSyntax: false,
  });

推荐答案

在react中,更新状态为异步.如果我们试图通过以下方式引用看似先前更新的状态来连续更新同一对象的两个不同键的状态,那么我们最终将得到一个不完整的更新.

const [inputs, setInputs] = useState({
    firstName: "",
    lastName: ""
})

const handleClick = () => {
    setInputs({ ...inputs, firstName: "John" })
    setInputs({ ...inputs, lastName: "Wayne" })
}

>> console.log(inputs)
>> { firstName: "", lastName: "Wayne" }

解决方案是pass a function,它将保持批量更新之前的状态-

setData(prevState => ({ ...prevState, input_email: text }));
...
setData(prevState => ({ ...prevState, wrongEmailSyntax: false }));

Javascript相关问答推荐

vanillajs-datepicker未设置输入值,日期单击时未触发更改事件

成帧器运动中的运动组件为何以收件箱开始?

有条件的悲剧

类型脚本中只有字符串或数字键而不是符号键的对象

为什么!逗号和空格不会作为输出返回,如果它在参数上?

分层树视图

无法检测卡片重叠状态的问题

获取Uint8ClampedArray中像素数组的宽度/高度

为什么可选参数的顺序会导致问题?

在JS中动态创建对象,并将其追加到HTML表中

无法重定向到Next.js中的动态URL

为列表中的项目设置动画

react -原生向量-图标笔划宽度

如何根据输入数量正确显示alert ?

调用特定数组索引时,为什么类型脚本不判断未定义

P5play SecurityError:无法从';窗口';读取命名属性';Add';:阻止具有源的帧访问跨源帧

如何在Web项目中同步语音合成和文本 colored颜色 更改

我想为我的Reaction项目在画布上加载图像/视频,图像正在工作,但视频没有

VITE版本中的内联SVG

如何导入我在Web Worker创建的函数?