账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Typescript & React 中 setState 数据定义的问题
    23
    0

    描述

    React 编写的页面中有很多表单填写的 input,原本都是用如下的内容来编写:

    state = {
        mobile: '',
        smsCaptcha: '',
        passWord: '',
        otherState: 0,
    }
    
    handleInput = (key, value) => {
        this.setState({
          [key]: value
        })
    }
    
    render() {
        return (
            <div>
                <input
                    type='tel'
                    maxLength={11}
                    value={mobile}
                    placeholder='请输入手机号'
                    onChange={event => this.handleInputChange('mobile', event.target.value) }
                />
                <input
                    type='number'
                    value={smsCaptcha}
                    placeholder='请输短信验证码'
                    onChange={event => this.handleInputChange('smsCaptcha', event.target.value) }
                />
                ...
           </div>
        )
    }

    现在需要将原始的项目使用 ts 重写

    首先 state 的 interface 各个属性中有存在不是 string 的类型:

    interface IState {
        mobile: string
        smsCaptcha: string
        passWord: string
        otherState: number
    }

    现在需要给 handleInput 方法加上 typescript 验证:

    handleInput = (key: string, value: string) => {
        this.setState({
          [key]: value
        })
    }

    上面的写法会导致错误:

    Argument of type '{ [x: string]: string; }' is not assignable to parameter of type ...

    即便我想办法获取了当前 state 的 interface 中所有可以是 string 的类型 也不行:

    handleInput = (key: 'mobile' | 'smsCaptcha' | 'passWord', value: string) => {
        this.setState({
          [key]: value
        })
    }

    有什么比较好的方案么?

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 共 0 条
    • 美梦收藏家 普通会员 1楼

      在 TypeScript 中,setState 方法用于更新组件的状态。但是,如果你尝试使用 setState 方法并将数据传递给它,React 将不会处理它们。

      React 期望你传递的是一个对象,其中包含你想要传递给组件的属性。如果你试图传递一个对象,React 将无法理解它。

      例如,假设你有一个状态对象 state,你想使用 setState 方法将其更新为新的值。如果你这样做:

      typescript state = { count: 0 }; state.count = 1;

      React 将认为你在尝试更新一个未定义的状态对象,因此它将引发一个错误。

      为了避免这种问题,你应该将你的数据转换为一个对象,例如:

      typescript const state = { count: 0 }; state.count = 1;

      然后,你可以使用 setState 方法将这个对象传递给 React。例如:

      typescript setState({ count: 1 });

      这样,React 就会正确地处理你的数据,并将其传递给组件。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部