React使用hooks遇到的坑_state中的某几个属性数据变成了空字符

简介: 本文讨论了在React使用hooks时遇到的一个问题:state中的某些属性数据变成了空字符。作者通过在修改函数中重新解构赋值来获取最新的state值,解决了因数据更新不及时导致的问题。

起点

使用了useReducer来代替了useState,因为要提交多个数据,使用useState需要声明很多变量,所以选择组件内部的redux_____useReducer

import React, {
    useState, useEffect, useReducer,  } from 'react';
let initialState = {
   
    name: "",
    idType: "",
    personId: "",
    tel: "",
    mobile: "",
    email: "",
}
const reducerFun = (state, init) => {
   
    let obj = {
   }
    obj[init.key] = init.value
    switch (init.type) {
   
        case "changeValue":
            return {
    ...state, ...obj };
        case "getDetails":
            return {
    ...state, ...init.obj }
        case "resetValue":
            return initialState;
        default:
            return state
    }
}
const FaultTolerantManage = () => {
   
    let {
    idType, name, personId, mobile, tel, email, } = state    
    useEffect(() => {
   
      //获取默认值 ...
    }, [])
  const updateInfoFun = () => {
   
        if (name === '') {
   
            message.warning("请输入名称")
            return false;
        }
        let namereg = "[^a-zA-Z\\u4e00-\\u9fa5]"
        if (!isValidInput(name, namereg)) {
   
            message.warning('名称只允许字母、中文!')
            return false
        }
        if (email === '') {
   
            message.warning("请输入email地址")
            return false;
        }
     }

     return (
        <div>
        //类似这样讲每一个元素都进行了绑定  inputName是对数据赋值的方法
            <Input title="固定电话" placeholder="请输入" value={
   tel} onChange={
   (e) => {
   inputName('tel', e) }} />
            .....
            //绑定修改点击事件
            <button>修改</button>
        </div>
        )
  }

问题表现

我的name和email字段都是必填的,但是我将email字段值变成空,第一次点击提交是没问题的,显示email不允许为空,这时候我再次点击修改按钮,就会提示我name为空,其实我的name是有值的。
当打印的时候可以看到name确实没有值。
但是我打印state.name是有值的。

解决办法

在修改函数中再次解构赋值,获取name、email等一系列的最新值。

  const updateInfoFun = () => {
   
        let {
    idType, name, personId, mobile, tel, email, } = state
        if (name === '') {
   
            message.warning("请输入名称")
            return false;
        }
        let namereg = "[^a-zA-Z\\u4e00-\\u9fa5]"
        if (!isValidInput(name, namereg)) {
   
            message.warning('名称只允许字母、中文!')
            return false
        }
        if (email === '') {
   
            message.warning("请输入email地址")
            return false;
        }
     }

原因:可能是数据更新不及时造成的,最顶端的解构赋值拿到的值并不是最新的值,有可能是因为组件没有重新render导致没有接收到最新的属性值。

目录
相关文章
|
10月前
|
前端开发
轻松掌握 React Hooks:简化状态与副作用管理
轻松掌握 React Hooks:简化状态与副作用管理
301 80
|
10月前
|
前端开发
React Hooks数据获取:避免内存泄漏的实战指南
React Hooks数据获取:避免内存泄漏的实战指南
|
6月前
|
缓存 前端开发 JavaScript
React Hooks深度解析与最佳实践:提升函数组件能力的终极指南
🌟蒋星熠Jaxonic,前端探索者。专注React Hooks深度实践,从原理到实战,分享状态管理、性能优化与自定义Hook精髓。助力开发者掌握函数组件的无限可能,共赴技术星辰大海!
React Hooks深度解析与最佳实践:提升函数组件能力的终极指南
|
前端开发
React Hooks:从基础到进阶的深入理解
React Hooks:从基础到进阶的深入理解
372 2
|
前端开发 JavaScript API
探究 React Hooks:如何利用全新 API 优化组件逻辑复用与状态管理
本文深入探讨React Hooks的使用方法,通过全新API优化组件逻辑复用和状态管理,提升开发效率和代码可维护性。
|
前端开发 JavaScript
React Hooks 深入解析
React Hooks 深入解析
220 0
|
缓存 前端开发 开发者
深入理解React Hooks,打造高效响应式UI
深入理解React Hooks,打造高效响应式UI
275 0
|
11月前
|
缓存 前端开发 数据安全/隐私保护
如何使用组合组件和高阶组件实现复杂的 React 应用程序?
如何使用组合组件和高阶组件实现复杂的 React 应用程序?
388 68
|
11月前
|
缓存 前端开发 Java
在 React 中,组合组件和高阶组件在性能方面有何区别?
在 React 中,组合组件和高阶组件在性能方面有何区别?
342 67
|
11月前
|
前端开发 JavaScript 安全
除了高阶组件和render props,还有哪些在 React 中实现代码复用的方法?
除了高阶组件和render props,还有哪些在 React 中实现代码复用的方法?
431 62