【问题标题】:Radio button not working单选按钮不起作用
【发布时间】:2018-01-17 10:30:21
【问题描述】:

我创建了一个无线电组件,但单击它时未显示已选中 这是代码

import React from 'react';
import classnames from 'classnames';

const RadioButton = (field) => {

  const inputClasses = classnames('form-group  has-feedback  ',{
    'has-error': field.meta.touched && field.meta.error,
  });
  return(
    <div className={inputClasses}>
        <label className="radio-inline custom-radio nowrap">
        <input
          disabled={field.disabled}
          type="radio"
          name={field.input.name}
          value={field.input.value}
          defaultChecked={field.defaultChecked}
          {...field.input}
        />
        <span>{field.label}</span>
      </label>
    </div>
  );
};

export default RadioButton;

这里是字段:

                      <Field
                        label="True"
                        component={RadioButton}
                        name="True"
                        type="radio"
                        value={true}
                       defaultChecked={ true }
                      />
                      <Field
                        label="False"
                        component={RadioButton}
                        name="False"
                        type="radio"
                        value={false}
                        defaultChecked={ false }
                      />

这是我在控制台上收到的警告: 警告:RadioButton 包含一个带有选中和 defaultChecked 属性的 radio 类型的输入。输入元素必须是受控或不受控的(指定选中的道具或 defaultChecked 道具,但不能同时指定两者)。决定使用受控或不受控的输入元素并删除这些道具之一

谁能帮我解决这个问题?

【问题讨论】:

  • 您是否在控制台中收到任何错误或警告?另外,你能告诉我们field对象的样子吗?
  • 你会更新问题。并且没有错误..我收到警告

标签: reactjs react-redux


【解决方案1】:

您应该查看官方文档,特别是有关Controlled ComponentsUncontrolled Components 的部分。


受控组件

基本上,使用受控组件,您可以让 React 管理所述元素的值。

一个输入表单元素,其值由 React 以这种方式控制,称为“受控组件”。

要创建受控组件,您需要一个存储其值的状态变量,以及一个根据某些事件(点击、输入等)改变其值的函数。

这是一个简单的例子:

class ControlledComponentDemo extends React.Component {
  constructor() {
    super();
    this.state = {
      input: "",
      radio: null,
      checkbox: []      
    };
  }
  
  changeInput = (e) => {
    this.setState({input: e.target.value});
  }
  
  changeRadio = (id) => {
    this.setState({radio: id});
  }
  
  changeCheckbox = (id) => {
    let arr = this.state.checkbox.slice();
    if(arr.indexOf(id) >= 0) {
      arr.splice(arr.indexOf(id), 1);
    } else {
      arr.push(id);
    }
    this.setState({checkbox: arr});
  }
  
  render() {
    return(
      <form>
        <input type="text" value={this.state.input} onChange={this.changeInput} />
        <br /><br />
        <input type="radio" name="myRadio" checked={this.state.radio === 0} onChange={this.changeRadio.bind(this, 0)} />
        <input type="radio" name="myRadio" checked={this.state.radio === 1} onChange={this.changeRadio.bind(this, 1)} />
        <br /><br />
        <input type="checkbox" name="myCheckbox" checked={this.state.checkbox.indexOf(0) >= 0} onChange={this.changeCheckbox.bind(this, 0)} />
        <input type="checkbox" name="myCheckbox" checked={this.state.checkbox.indexOf(1) >= 0} onChange={this.changeCheckbox.bind(this, 1)} />
      </form>
    );
  }
}

ReactDOM.render(<ControlledComponentDemo />, document.getElementById("app"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>

不受控制的组件

顾名思义,在不受控制的组件中,React 不管理表单元素的值。相反,这些是由 DOM 直接以“传统方式”管理的。

在受控组件中,表单数据由 React 组件处理。另一种方法是不受控制的组件,其中表单数据由 DOM 本身处理。

创建一个不受控制的组件很容易:

class UncontrolledComponentDemo extends React.Component {
  render() {
    return(
      <form>
        <input type="text" />
        <br /><br />
        <input type="radio" name="myRadio" />
        <input type="radio" name="myRadio" />
        <br /><br />
        <input type="checkbox" name="myCheckbox" />
        <input type="checkbox" name="myCheckbox" />        
      </form>
    );
  }
}

ReactDOM.render(<UncontrolledComponentDemo />, document.getElementById("app"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>

您的代码的问题在于您有受控和不受控组件的混合语法。

在受控组件中,值在状态中定义并传递到valuechecked 道具(取决于输入类型),如我上面演示的那样。

由于不受控制的组件不受状态管理,我们也不应该将任何东西传递给valuechecked 属性。这样做没有意义,因为 DOM 会自行管理。

我们可以做的是告诉 DOM 元素的初始值。例如,文本输入可能已经输入了某些内容,或者已经选中了复选框。我们使用 defaultValue 属性来做到这一点。

这就是你所做的混淆。您在这里同时使用defaultValuechecked。因此警告:

警告:RadioButton 包含带有选中和 defaultChecked 属性的 radio 类型的输入。输入元素必须是受控或不受控的(指定选中的道具或 defaultChecked 道具,但不能同时指定两者)。在使用受控或不受控的输入元素之间做出决定并删除这些道具之一。

我还应该提到,受控组件是 React 推荐的组件。您仍然应该阅读我上面链接的文档部分。

【讨论】:

  • 非常感谢克里斯..你能告诉我我必须做哪些改变才能让它工作..如果我删除 {...field.input} 它不会接受你说的选择的输入我把事情搞混了。所以你能告诉我我应该怎么做才能得到初始值。
  • 我不知道 {field.input} 中有什么,也不知道它是否需要任何东西。但是如果你按照我的有状态示例,只需添加一个 value 属性并确保它有一个初始值开始(在构造函数中设置)
【解决方案2】:

请使用这个!

效果很好!

            <label>
                <input type="radio" defaultChecked={true} disabled={false} value={YOUR_Value} />
                {this.state.content}
            </label>

【讨论】:

  • 你的意思是在没有任何属性的情况下赋值?请参考 HTML 中的输入标签!
  • JSX 没问题。你必须使用正确的语法。 {...field.input } // 在这里使用它!
  • 不,OP 正确使用了它。这叫解构道具。
猜你喜欢
  • 2015-11-15
  • 2016-01-06
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
  • 2013-12-27
  • 2011-05-03
  • 2016-11-10
相关资源
最近更新 更多