【问题标题】:React radio buttons not setting initial value; only subsequent values反应单选按钮未设置初始值;只有后续值
【发布时间】:2017-12-06 18:29:01
【问题描述】:

我有一个带有 4 个无线电输入的表单。我希望使用检查输入的值更新组件状态。

当前输入是检查值后面的一个值(即直到第二次点击才开始正确更新状态)。

如何让它在第一次点击时设置状态?

component.js

import React, { Component } from 'react';

class Graph extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      option: null
    };
  }

  setOption(value) {
    this.setState({option: value});
  }

  render() {
    return (
      <form>
        <input
        type="radio"
        name="option"
        onChange={(e) => this.setOption('tmax_C')}
        checked={ this.state.option === 'tmax_C' }
        value="tmax_C" />
        <label htmlFor="option">Max Temp.</label>

        <input type="radio"
        name="option"
        onChange={(e) => this.setOption('tmin_C')}
        checked={ this.state.option === 'tmin_C' }
        value="tmin_C" />
        <label htmlFor="option">Min Temp</label>

        <input type="radio"
        name="option"
        onChange={(e) => this.setOption('rain_mm')}
        checked={ this.state.option === 'rain_mm' }
        value="rain_mm" />
        <label htmlFor="option">Rain mm</label>

        <input type="radio"
        name="option"
        onChange={(e) => this.setOption('sunshine_hours')}
        checked={ this.state.option === 'sunshine_hours' }
        value="sunshine_hours" />
        <label htmlFor="option">Sunshine Hours</label>
      </form>
    );
  }
}

export default Graph;

【问题讨论】:

  • 你需要像setOption = (value) =&gt; { ... }这样声明函数setOption,否则你需要在构造函数中绑定它。
  • 我也不想用这个onChange={(e) =&gt; this.setOption('xxxx')} inline...建议改用函数

标签: javascript reactjs


【解决方案1】:

设置组件状态是异步的。使用函数会立即更新组件:this.setState(() =&gt; ({option: value}));

更多信息:react setState docs

根据您问题的第二部分:使处理程序更具功能性的另一种方法是返回一个设置传递值的处理程序:

import React, { Component } from 'react';

class Graph extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      option: null
    };
  }

  setOption = (value) =>
    this.setState(() => {
      return { option: value };
    });


  render() {
    return (
      <form>
        <input
        type="radio"
        name="option"
        onChange={this.setOption('tmax_C')}
        checked={ this.state.option === 'tmax_C' }
        value="tmax_C" />
        <label htmlFor="option">Max Temp.</label>

        <input type="radio"
        name="option"
        onChange={this.setOption('tmin_C')}
        checked={ this.state.option === 'tmin_C' }
        value="tmin_C" />
        <label htmlFor="option">Min Temp</label>

        <input type="radio"
        name="option"
        onChange={this.setOption('rain_mm')}
        checked={ this.state.option === 'rain_mm' }
        value="rain_mm" />
        <label htmlFor="option">Rain mm</label>

        <input type="radio"
        name="option"
        onChange={this.setOption('sunshine_hours')}
        checked={ this.state.option === 'sunshine_hours' }
        value="sunshine_hours" />
        <label htmlFor="option">Sunshine Hours</label>
      </form>
    );
  }
}

export default Graph;

【讨论】:

  • 抱歉,您介意澄清一下代码现在应该是什么样子吗?如果我将上面的函数更改为这样读取,我会收到一个控制台错误(SyntaxError: Unexpected token)并且我的 linter 说“类属性必须是方法”
  • @EMPenrose 他的意思是用this.setState(() =&gt; ({option: value}));替换this.setState({option: value});
  • 它现在看起来像这样:setOption(value) { this.setState(() =&gt; ({option: value})); } , 但我得到了同样的错误,即首先打印空
  • 我认为您遇到的错误是因为处理程序未绑定到正确的 this 上下文。通过将其更改为箭头函数,它会获得正确的 this 绑定
猜你喜欢
  • 2011-08-17
  • 2015-03-22
  • 1970-01-01
  • 2020-11-05
  • 2021-07-08
  • 2019-10-13
  • 2016-07-28
  • 1970-01-01
  • 2017-04-14
相关资源
最近更新 更多