如何在 ReactJS 中使用单选按钮?

IT技术 html reactjs
2021-03-29 00:45:18

我是 ReactJS 的新手,如果这听起来不对,抱歉。我有一个组件可以根据接收到的数据创建多个表行。

列中的每个单元格都有一个单选框。因此,用户可以从现有行中选择一个site_name和一个address选择应显示在页脚中。这就是我被卡住的地方。

var SearchResult = React.createClass({
  render: function () {
    var resultRows = this.props.data.map(function (result) {
      return (
        <tbody>
          <tr>
            <td>
              <input type="radio" name="site_name" value={result.SITE_NAME}>
                {result.SITE_NAME}
              </input>
            </td>
            <td>
              <input type="radio" name="address" value={result.ADDRESS}>
                {result.ADDRESS}
              </input>
            </td>
          </tr>
        </tbody>
      );
    });
    return (
      <table className="table">
        <thead>
          <tr>
            <th>Name</th>
            <th>Address</th>
          </tr>
        </thead>
        {resultRows}
        <tfoot>
          <tr>
            <td>chosen site name ???? </td>
            <td>chosen address ????? </td>
          </tr>
        </tfoot>
      </table>
    );
  },
});

在 jQuery 中,我可以做一些事情,比如$("input[name=site_name]:checked").val()选择一个单选复选框类型并将其插入到第一个页脚单元格中。

但肯定必须有一种 Reactjs 方式,我完全想念它吗?非常感谢

6个回答

对渲染的任何更改都应该通过statepropsreact doc进行更改

所以在这里我注册了输入的事件,然后更改了state,这将触发渲染以显示在页脚上。

var SearchResult = React.createClass({
  getInitialState: function () {
    return {
      site: '',
      address: '',
    };
  },
  onSiteChanged: function (e) {
    this.setState({
      site: e.currentTarget.value,
    });
  },

  onAddressChanged: function (e) {
    this.setState({
      address: e.currentTarget.value,
    });
  },

  render: function () {
    var resultRows = this.props.data.map(function (result) {
      return (
        <tbody>
          <tr>
            <td>
              <input
                type="radio"
                name="site_name"
                value={result.SITE_NAME}
                checked={this.state.site === result.SITE_NAME}
                onChange={this.onSiteChanged}
              />
              {result.SITE_NAME}
            </td>
            <td>
              <input
                type="radio"
                name="address"
                value={result.ADDRESS}
                checked={this.state.address === result.ADDRESS}
                onChange={this.onAddressChanged}
              />
              {result.ADDRESS}
            </td>
          </tr>
        </tbody>
      );
    }, this);
    return (
      <table className="table">
        <thead>
          <tr>
            <th>Name</th>
            <th>Address</th>
          </tr>
        </thead>
        {resultRows}
        <tfoot>
          <tr>
            <td>chosen site name {this.state.site} </td>
            <td>chosen address {this.state.address} </td>
          </tr>
        </tfoot>
      </table>
    );
  },
});

jsbin

那非常有用。谢谢。我不明白的是位}, this);刚下的</tbody>它是什么,它有什么作用?我注意到没有代码崩溃。
2021-05-28 00:45:18
使用两个函数来获取单选按钮的值似乎不明确且不必要。你可以只定义一个函数,也许onInputChange (e) {this.setState({ [e.target.name]: e.target.value }); }
2021-06-05 00:45:18
this是传递给上下文map功能这是@FakeRainBrigand 的编辑,不错!没有它,您this在 map 函数中将引用window,它不知道state是关于什么的
2021-06-10 00:45:18
this如果您使用 ES6 箭头而不是常规函数,则不需要技巧。例如:var resultRows = this.props.data.map((result) => { ... });我之所以提到它,是因为 React-ers 通常已经在使用某种形式的转译(对于 JSX),所以 ES6 通常很容易实现。
2021-06-17 00:45:18

这是在 react js 中实现单选按钮的最简单方法。

class App extends React.Component {
  
  setGender(event) {
    console.log(event.target.value);
  }
  
  render() {
    return ( 
      <div onChange={this.setGender.bind(this)}>
        <input type="radio" value="MALE" name="gender"/> Male
        <input type="radio" value="FEMALE" name="gender"/> Female
      </div>
     )
  }
}

ReactDOM.render(<App/>, 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>

已编辑

您可以使用箭头函数代替绑定。将上面的代码替换为

<div onChange={event => this.setGender(event)}>

对于默认值使用defaultChecked,像这样

<input type="radio" value="MALE" defaultChecked name="gender"/> Male
如果将此函数作为道具传递给子组件,则每个渲染上的新函数只会成为问题。在这种情况下,接收道具的子组件可能会不必要地呈现。父组件没问题。
2021-05-23 00:45:18
我同意@Squrler——对于onChange,对于包含在div 下的每个单选按钮,句柄只触发一次。使用 onClick,它可以多次工作。不知道为什么这与您的代码段相比...
2021-05-28 00:45:18
@Saahithyan 我的所有收音机都有相同的名称属性。结果我需要将一个 onClick 处理程序放置到无线电输入中,而不是一个 onChange 处理程序。这就是诀窍。
2021-06-01 00:45:18
对我来说,这仅适用于单击共享相同名称的每个收音机一次。例如,我有两个具有相同name道具的收音机它们都包含在一个 div 中,该 div 具有onChange此答案中所述处理程序。我单击第一个收音机,触发了一个事件。我单击第二个收音机,触发了一个事件。但是,第三次及以后,不会触发任何事件。为什么?
2021-06-10 00:45:18
我相信.bind(this)每次都会创建一个新功能。这意味着当 react 检查虚拟 DOM 中是否有任何更改时,该组件将始终不同,并且始终需要重新渲染。
2021-06-16 00:45:18

根据React Docs 所说

处理多个输入。 当需要处理多个受控输入元素时,可以为每个元素添加一个name属性,让处理函数根据event.target.name的值来选择要做什么。

例如:

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {};
  }

  handleChange = e => {
    const { name, value } = e.target;

    this.setState({
      [name]: value
    });
  };

  render() {
    return (
      <div className="radio-buttons">
        Windows
        <input
          id="windows"
          value="windows"
          name="platform"
          type="radio"
          onChange={this.handleChange}
        />
        Mac
        <input
          id="mac"
          value="mac"
          name="platform"
          type="radio"
          onChange={this.handleChange}
        />
        Linux
        <input
          id="linux"
          value="linux"
          name="platform"
          type="radio"
          onChange={this.handleChange}
        />
      </div>
    );
  }
}

链接到示例:https : //codesandbox.io/s/6l6v9p0qkr

一开始,没有一个单选按钮被选中,所以this.state是一个空对象,但是每当单选按钮被选中时,this.state都会获得一个带有输入名称及其值的新属性。然后可以轻松检查用户是否选择了任何单选按钮,例如:

const isSelected = this.state.platform ? true : false;

编辑:

在 React 的 16.7-alpha 版本中,有一个叫做的提议hooks它可以让你更轻松地做这种事情:

在下面的示例中,功能组件中有两组单选按钮。尽管如此,他们还是控制了输入:

function App() {
  const [platformValue, plaftormInputProps] = useRadioButtons("platform");
  const [genderValue, genderInputProps] = useRadioButtons("gender");
  return (
    <div>
      <form>
        <fieldset>
          Windows
          <input
            value="windows"
            checked={platformValue === "windows"}
            {...plaftormInputProps}
          />
          Mac
          <input
            value="mac"
            checked={platformValue === "mac"}
            {...plaftormInputProps}
          />
          Linux
          <input
            value="linux"
            checked={platformValue === "linux"}
            {...plaftormInputProps}
          />
        </fieldset>
        <fieldset>
          Male
          <input
            value="male"
            checked={genderValue === "male"}
            {...genderInputProps}
          />
          Female
          <input
            value="female"
            checked={genderValue === "female"}
            {...genderInputProps}
          />
        </fieldset>
      </form>
    </div>
  );
}

function useRadioButtons(name) {
  const [value, setState] = useState(null);

  const handleChange = e => {
    setState(e.target.value);
  };

  const inputProps = {
    name,
    type: "radio",
    onChange: handleChange
  };

  return [value, inputProps];
}

工作示例:https : //codesandbox.io/s/6l6v9p0qkr

使无线电组件成为哑组件并将props传递给父级。

import React from "react";

const Radiocomponent = ({ value, setGender }) => ( 
  <div onChange={setGender.bind(this)}>
    <input type="radio" value="MALE" name="gender" defaultChecked={value ==="MALE"} /> Male
    <input type="radio" value="FEMALE" name="gender" defaultChecked={value ==="FEMALE"}/> Female
  </div>
);

export default Radiocomponent;

它很容易测试,因为它是一个愚蠢的组件(一个纯函数)。

可能应该使用“已检查”。我很确定这是“defaultChecked”的错误使用......
2021-05-25 00:45:18

这里只是一个想法:当谈到 React 中的无线电输入时,我通常以不同的方式呈现所有这些,这在之前的答案中提到过。

如果这可以帮助需要呈现大量单选按钮的任何人:

import React from "react"
import ReactDOM from "react-dom"

// This Component should obviously be a class if you want it to work ;)

const RadioInputs = (props) => {
  /*
    [[Label, associated value], ...]
  */
  
  const inputs = [["Male", "M"], ["Female", "F"], ["Other", "O"]]
  
  return (
    <div>
      {
        inputs.map(([text, value], i) => (
	  <div key={ i }>
	    <input type="radio"
              checked={ this.state.gender === value } 
	      onChange={ /* You'll need an event function here */ } 
	      value={ value } /> 
    	    { text }
          </div>
        ))
      }
    </div>
  )
}

ReactDOM.render(
  <RadioInputs />,
  document.getElementById("root")
)
<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="root"></div>

@nbkhope 如果我必须重写它,我也会改用 object !:)
2021-05-28 00:45:18
检查这一行:checked={ this.state.gender === value }功能组件没有this.
2021-05-29 00:45:18
Intead of a div in:<div key={ i }> 我会设置一个标签。
2021-05-31 00:45:18
这很棒。非常干燥,让事情变得美好。我会为每个选项使用一个对象,但我想这是一个偏好问题。
2021-06-07 00:45:18