【问题标题】:How to map trough array of object and toggle boolean property selected如何映射对象数组并切换选定的布尔属性
【发布时间】:2020-04-09 12:44:36
【问题描述】:

我在 React 功能组件中有状态。它是对象数组。该集合中的每个对象都有属性“selected”,它是一个布尔值。该数组如下所示:

const [filterOptions, setFilterOptions] = useState([
        {
            title: 'highest',
            selected: true,
        },
        {
            title: 'lowest',
            selected: false,
        },
    ]);

handleFilter func 执行后,我需要设置状态,以便该数组具有相同的标题属性但反向(切换)选定的属性。

这是 handleFilter 函数,我需要在其中切换数组对象的每个选定属性:

const handleFilter = () => {
        setFilterOptions();
    };

【问题讨论】:

  • 你想要的输出是什么?无法从您的帖子中理解

标签: reactjs


【解决方案1】:
function App() {

    const [filterOptions, setFilterOptions] = useState([
        {
            title: 'highest',
            selected: true,
        },
        {
            title: 'lowest',
            selected: false,
        },
    ]);

    const handleFilter = (e) => {
        let newArr = [...filterOptions];

        let value = e.target.value;

        if (value === "lowest") {

            newArr[0].selected = true;
            newArr[1].selected = false;

        } else if (value === "highest") {

            newArr[0].selected = false;
            newArr[1].selected = true;

        } 

        setFilterOptions(newArr)

    };
    return (
        <div>
            <select onChange={handleFilter}>
                <option value="lowest">a</option>
                <option value="highest">b</option>
            </select>
            {console.log((filterOptions))}
        </div>
    );
}

【讨论】:

  • 我看不到这个解决方案如何切换选定的布尔属性?我猜你的意思是 !value
【解决方案2】:

请检查希望它会工作

var arryObj =[
        {
            title: 'highest',
            selected: true,
        },
        {
            title: 'lowest',
            selected: false,
        },
    ]

const handleFilter = (index,value) => {
    arryObj[index].selected = value
    };
handleFilter(0,false)
console.log(arryObj)
handleFilter(1,true)
console.log(arryObj)

【讨论】:

  • 但是如果我不知道该数组中的对象数量怎么办?我在这里看到您对带有索引 0 和 1 的 handleFilter 的硬编码调用?这需要设置为状态
  • 是的,只是硬编码,希望您将使用地图来渲染这些项目,这样您就可以传递地图索引和带有符号的 item.selected !像这样 !item.selected 它的意思是 item.selected = true 并且像这样传递 !item.selected 它会更新你的对象示例 filterOptions.map((item,index)=>( ///*UI 这里和点击功能像这样 this.handleFilter(index, !item.selected)*//// )) 谢谢 :-)
【解决方案3】:

您可以将函数传递给setFilterOptions,以根据之前的状态更改状态。

const handleFilter = () => {
    setFilterOptions(prevState => 
        prevState.map(obj => ({...obj, selected: !obj.selected}))
    );
};

【讨论】:

  • 对于这个解决方案,我得到 eslint 错误“预期声明或声明”
  • @Pokreniseweb 糟糕,我忘记了一对括号哈哈哈。修好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多