为了账号安全,请及时绑定邮箱和手机立即绑定

React:如何在每个映射的数组项上传递状态?

React:如何在每个映射的数组项上传递状态?

繁星点点滴滴 2023-02-17 15:48:47
我在函数组件中使用 Array.map 方法呈现了一个按钮列表。当我尝试将状态传递给每个映射的数组项时,渲染结果会立即更改所有数组项,而不是一个一个地更改。这是我的代码。难道我做错了什么?抱歉,如果问题已在其他线程中解决,或者我使用了错误的方法。这是我的第一个 React 项目,我还在学习中。如果有人可以提供建议,我们将不胜感激。谢谢你!import React, { useState } from "react"export default function Comp() {  const [isActive, setActive] = useState(false)  const clickHandler = () => {    setActive(!isActive)    console.log(isActive)  }  const data = [    { id: 1, name: "Alice" },    { id: 2, name: "Bob" },    { id: 3, name: "Charlie" },  ]  const renderList = items => {    return items.map(item => (      <li key={item.id}>        <button onClick={clickHandler}>          {item.name} {isActive ? "active" : "not active"}        </button>      </li>    ))  }  return (    <ul>{renderList(data)}</ul>  )}
查看完整描述

2 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

将单个项目放入不同的组件中,以便每个组件都有自己的active状态:


export default function Comp() {

  const data = [

    { id: 1, name: "Alice" },

    { id: 2, name: "Bob" },

    { id: 3, name: "Charlie" },

  ]


  const renderList = items => (

    items.map(item => <Item key={item.id} name={item.name} />)

  );


  return (

    <ul>{renderList(data)}</ul>

  )

}

const Item = ({ name }) => {

  const [isActive, setActive] = useState(false);

  const clickHandler = () => {

    setActive(!isActive);

  };

   return (

    <li>

      <button onClick={clickHandler}>

        {name} {isActive ? "active" : "not active"}

      </button>

    </li>

  );

};


查看完整回答
反对 回复 2023-02-17
?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

您需要设置active-id在处理click-event. 这将依次呈现active/non-active conditionally:


注意流量(1) > (2) > (3)


function Comp() {

  const [activeId, setActiveId] = React.useState(null);

  const clickHandler = (item) => {

    setActiveId(item.id) // (2) click-handler will set the active id

  }


  const data = [

    { id: 1, name: "Alice" },

    { id: 2, name: "Bob" },

    { id: 3, name: "Charlie" },

  ]


  const renderList = items => {

    return items.map(item => (

      <li key={item.id}>

        <button onClick={() => clickHandler(item)}> // (1) passing the clicked-item so that we can set the active-id

          {item.name} {item.id === activeId ?

            "active" : "not active" // (3) conditionally render

          }

        </button>

      </li>

    ))

  }


  return (

    <ul>{renderList(data)}</ul>

  )

}


祝你好运...


查看完整回答
反对 回复 2023-02-17
  • 2 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信