以对象作为属性值react选择选项

IT技术 javascript html reactjs
2021-04-05 10:00:52

当我想更改所选选项时,我遇到了react问题。问题是该值是一个对象,我无法在选项值属性中传递它。

请参阅以下代码:

class Selector extends React.Component {
  contructor(props) {
    super(props)
    this.state = { obj: null }
    this.handleChange = this.handleChange.bind(this)
  }

  handleChange(e) {
    this.setState({obj: e.target.value})
  }

  render() {
    <select onChange={handleChange}>
     {this.props.listOption.map((option, index) => 
       <option key={index} value={option.obj}>
         {option.name}
       </option>
     )}
    </select>
  }
}

<Selector option={[{name: "name", obj:{...}}, ...]}>

我需要使用所选选项的值更改组件的状态。当状态改变时我得到的是"object Object". 我想这是因为 react 无法在最终视图的属性中嵌入 javascript 对象。我是对的?

此外,我obj在构造函数中将 state设置为 null 有没有正确的方法来做到这一点?

5个回答

您可以利用indexoptions

class Selector extends React.Component {
  contructor(props) {
    super(props);
    this.state = { obj: null }
    this.handleChange = this.handleChange.bind(this)
  }

  handleChange(e) {
    this.setState({obj: this.props.listOption[e.target.value].obj})
  }

  render() {
    <select onChange={handleChange}>
     {this.props.listOption.map((option, index) =>
       <option key={index} value={index}>
        {option.name}
       </option>
      )}
    </select>
  }
}

此外,我在构造函数中将状态中的 obj 设置为 null 有没有正确的方法来做到这一点?

我取决于你的要求。如果您想至少显示一个选项,您可以保留它而不是null

谢谢,这正是我想知道的!
2021-05-30 10:00:52
@Jyothi 你能回答这个问题吗🥲,我用你的回答但不能工作stackoverflow.com/questions/66961671/...
2021-06-03 10:00:52
这是我寻找一种“反应方式”来做某事的事情之一,我所需要的只是一种 JavaScript 方式来做这件事。
2021-06-06 10:00:52

将对象转换为 JSON字符串,并将其作为值传递。

并将字符串转换回处理程序中的对象。

handleChange(event) {
    let obj = JSON.parse(event.target.value); //object
  }

  render() {
    <select onChange={handleChange}>
     {this.props.listOption.map((option, index) => 
       <option key={index} 
         value={JSON.stringify(option)}> //pass object string as value
         {option.name}
       </option>
     )}
    </select>
  }
@MatheusRibeiro 我修改了标题。感谢您的反馈 :)
2021-05-25 10:00:52
Sreeragh 请你回答这个问题好吗🥲,我用你的回答但不能工作。 stackoverflow.com/questions/66961671/...
2021-06-13 10:00:52
我觉得读这个 awnser 很迟钝,但这解决了我的问题,谢谢 LOL
2021-06-17 10:00:52

我假设您只想选择一个选项。所以最简单的方法是设置 selectedIndex。使用构造时,请始终考虑值类型。this.state = { selectedIndex: 0}

现在你已经声明了 selectedIndex 对象,它首先等于 0。

在渲染方法中,您可以只检查索引:

{this.props.listOption.map((option, index) => {
    this.state.selectedIndex == index ? (
      <option key={index} value={option.obj} selected>option.name</option>
    ): (
      <option key={index} value={option.obj}>option.name</option>
    ))}

并使用 e.target.key 处理更改 setState。

我可能留下了语法错误...虽然我希望它有所帮助。

试试下面的代码,

import React from 'react';

class LocationDemo extends React.Component {

    constructor(props) {
        super(props);
        this.state = {
            searchLoc: undefined,
            selectedLoc: "",
            locs:[
                {"name" : "Kerala","districts":["Ernakulam", "Trivandrum"]},
                {"name" :"Tamil Nadu","districts" :["Palani","Tiruchi"]}
            ],
        };
        this.handleChangeLocation = this.handleChangeLocation.bind(this);
    }


    handleChangeLocation = (event) => {
        this.setState({ selectedLoc: event, searchLoc: event.target.value }
            , () => console.log("searchLoc", this.state.searchLoc));
    }

    render() {
        return (
            <select class="cls-location" id="id-location"
                onChange={this.handleChangeLocation}
                value={this.state.locs.find(obj => obj.value === this.state.selectedLoc)}
                required
            >
                {
                    this.state.locs.map(loc => {
                        return (
                            <option name={loc.name} value={JSON.stringify(loc)}>{loc.name}</option>
                        )
                    })
                }
            </select>

        );
    }
}

export default LocationDemo;

就我而言,我还需要currentValue在初始化时选择一个选项对象 ( )。

我不想搜索该对象this.props.listOption以获取其索引。

因此,我没有用索引替换对象,而是data-index向选项添加了一个自定义属性

可以使用以下方法访问data-index选项的属性值optionoption.dataset.index

handleChange(e) {
  const selectedIndex = e.target.selectedOptions[0].dataset.index];
  this.setState({obj: this.props.listOption[selectedIndex].obj})
}

render() {
  <select value={currentValue} onChange={handleChange}>
    {this.props.listOption.map((option, index) =>
      <option key={index} value={option.obj} data-index={index}>
        {option.name}
      </option>
    )}
  </select>
}

该代码应该不难适应多选。