【问题标题】:Radio button not updating correctly based on change in Select option in React单选按钮未根据 React 中 Select 选项的更改正确更新
【发布时间】:2020-09-04 21:24:02
【问题描述】:

我有一个带有 2 个选项的选择下拉菜单和一个带有 2 个值的单选按钮。 (参考下面的代码)当页面加载时,“象限 1”是默认的选择选项,默认情况下不会选择任何单选按钮。

对于选择选项的“象限 1”,我将在单选按钮中选择“否”。对于选择选项的“象限2”,我将选择“是”。这些值相应地存储在“网格”状态中。每当进行更改时,我都能成功捕获这些状态更新。

但是当我在选择选项之间切换时,单选按钮没有相应改变。我知道每当更改选择选项时,我都必须更新单选按钮的“已检查”属性。但我无法做到这一点。如果我错了,请原谅我,因为我是 ReactJS 的新手,并且在过去 1 周里碰到了我的头。

请帮助我在选择选项更改时更新单选按钮。

Updated RuleScreen.js:

[Correct Grid State details but radio button not updated][1]
import React, { Component } from "react";
import M from "materialize-css";
import dropDownList from "./dropDown";
import _ from "lodash";

class RuleScreen extends Component {

  constructor(props){
    super(props);
    this.state = {
      quad: "Q1",
      grid: [{id:"Q1", optin:"",NL:""}, {id:"Q2", optin:"", NL:""}]
    };
  }

  componentDidMount() {
    var elems = document.querySelectorAll('select');
    M.FormSelect.init(elems, {hover: true, coverTrigger: false});
  }

  quadChange = async (e) => {
    await this.setState({ quad:e.target.value});
  }

  optinChange = async (e) => {
    const currQuad = this.state.quad;
    const value = e.target.value;
    await this.setState(prevState => ({
      grid: prevState.grid.map(
        item => item.id === currQuad? { ...item, optin: value}: item
      )
    }))
  }

  render() {
    const selectedGrid = this.state.grid.filter(quad=>quad.id === this.state.quad)
    return (
      <div>
        <h3>Rule Setup</h3>
        <div className="container">
          <div className="btn">
            <select required value={this.state.quad} onChange={this.quadChange}>
              <option key="Q1" value="Q1">Quadrant 1</option>
              <option key="Q2" value="Q2">Quadrant 2</option>
            </select>
          </div>
          <form>
            <label>Opt In</label>
            <label><input id="yes" checked={selectedGrid[0].optin=== 'yes' } onChange={this.optinChange} value="yes" className="with-gap" name="optin" type="radio"/>
                <span>Yes</span>
            </label>
            <label><input id="no" checked={selectedGrid[0].optin=== 'no' } onChange={this.optinChange} value="no" className="with-gap" name="optin" type="radio"/>
                <span>No</span>
            </label>
          </form>
        </div>
      </div>
    );
  }
}


export default RuleScreen;

【问题讨论】:

    标签: reactjs web-component react-component select-options


    【解决方案1】:

    由于您使用数组函数,您不必将函数绑定到“this”。 我没有测试代码,但想法就在这里。 向单选按钮添加值,删除值的 getter,在渲染中向网格添加选择器

    class RuleScreen extends Component {
    
          constructor(props){
            super(props);
            this.state = {
              quad: "Q1",
              grid: [{id:"Q1", optin:"", NL:""}, {id:"Q2", optin:"", NL:""}]
            };
          }
    
          componentDidMount() {
            var elems = document.querySelectorAll('select');
            M.FormSelect.init(elems, {hover: true, coverTrigger: false});
          }
    
          quadChange = (e) => {
            this.setState({ quad:e.target.value});
          }
    
          optinChange = (e) => {
            const currQuad = this.state.quad;
            const value = e.target.value;
            this.setState(prevState => ({
              grid: prevState.grid.map(
                item => item.id === currQuad? { ...item, optin: value}: item
              )
            }))
          }
          
    
          render() {
            const selectedGrid = this.state.grid.filter(quad=>quad.id === this.state.quad) //maybe with [0] at the end
            return (
              <div>
                <h3>App Name</h3>
                <div className="container">
                  <div className="btn">
                    <select required value={this.state.quad} onChange={this.quadChange}>
                     <option key="Q1" value="Q1">Quadrant 1</option>
                     <option key="Q2" value="Q2">Quadrant 2</option>
                    </select>
                  </div>
                  <form>
                    <div>Opt In</div>
                    <label>
                      <input id="yes" checked={selectedGrid.optin === 'yes'} onChange={this.optinChange} value="yes" className="with-gap" name="optin" type="radio"/>
                        <span>Yes</span>
                    </label>
                    <label>
                      <input id="no" checked={selectedGrid.optin === 'no'} onChange={this.optinChange} value="no" className="with-gap" name="optin" type="radio"/>
                        <span>No</span>
                    </label>
                  </form>
              </div>
            )
          }
    }
    
    
    export default RuleScreen;
    

    【讨论】:

    • 我已经更新了提到的代码(参考问题块中的代码)。但现在我无法“检查”任何单选按钮。但是, optinChange 功能有效,并且状态正在更新,没有任何问题。但是单选按钮看起来没有选中。我不确定我做错了什么。
    • 非常感谢。在 selectedGrid checked={selectedGrid[0].optin==="yes"} 中添加 [0] 后问题得到解决。
    • 是的,就是这样,因为 Array.filter 返回一个数组。
    • 你可以在这里做: const selectedGrid = this.state.grid.filter(quad=>quad.id === this.state.quad)[0]
    猜你喜欢
    • 1970-01-01
    • 2018-03-24
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多