【问题标题】:How to hide a specific element inside .map function in React?如何在 React 中隐藏 .map 函数中的特定元素?
【发布时间】:2020-11-05 07:24:20
【问题描述】:

我正在寻找一种方法来隐藏一个 div,一旦单击其中的按钮并继续显示所有其他 div。

我尝试使用 setState 方法,但是当使用 onClick() 将其设置为 false 时,我的所有对象都消失了。

class App extends React.PureComponent {

    state: {
        notHidden: false,       
    }

    constructor(props: any) {
        super(props);
        this.state = {search: '', notHidden: true};

        this.hideObject = this.hideObject.bind(this)
    }

    hideThisDiv() {
        this.setState({notHidden: false})
    }

    async componentDidMount() {
        this.setState({
            objects: await api.getObjects()
        });
    }

render = (objects: Object[]) => {
return ({Object.map((object) => 

        <div key={index} className='class'>             
            <button className='hide' type='button' onClick={() => hideThisDiv()}>Hide</button>
            <p>object.text</p>
        </div>}

render() {  
        const {objects} = this.state;

        return (<main>
            <h1>Objects List</h1>
            <header>
                <input type="search" onChange={(e) => this.onSearch(e.target.value)}/>
            </header>
            {objects ? this.render(objects) : null}
        </main>)
    }
);

数据是一个 data.json 文件,其中填充了数组中的许多此类对象

{
   "uuid": "dsfgkj24-sfg34-1r134ef"
   "text": "Some Text"
}


编辑:抱歉问题问得不好,我是新手。

【问题讨论】:

  • 请提供更多代码,而不仅仅是返回。我们需要查看您的“对象”以及您如何使用 useState
  • 您需要为所有要“隐藏”的映射元素保留一个状态。然后,如果应该隐藏它,您可以有条件地呈现 null,或者先过滤您的状态,然后再映射。或者,您可以将显示/隐藏状态抽象为一个管理其自身可见性的组件。 () =&gt; hideThisDiv 无效。请提供Minimal, Complete, and Reproducible 代码示例。

标签: javascript reactjs html-rendering


【解决方案1】:

未经测试,只是一个蓝图......这是你想做的吗? 是的,我没有隐藏,我删除了,但再次,只是一个关于如何单独隐藏按钮的想法,通过保持关注哪些按钮的状态。

function MagicList() {
    const [hidden, hiddenSet] = useState([]);
    const items = [{ id:1, text:'hello'}, { id:2, text:'from'}, { id:3, text:'the other sided'}]
    
    const hideMe = id => hiddenSet([...hidden, id]);

    return {
        items.filter( item => {
            return hidden.indexOf(item.id) !== -1;
        })
        .map( item => (
            <button key={item.id} onClick={hideMe.bind(this, item.id)}>{item.text}</button>
        ))
    };
}

版本

const hideMe = id =&gt; hiddenSet([...hidden, id]);

这只是一种花哨的写法:

    function hideMe(id) {
       const newArray = hidden.concat(id);
       hiddenSet(newArray);
    }

【讨论】:

  • 我不太确定你想在那里做什么,所以如果点击按钮,按钮就会消失,那么是的。但是,因为我是新手,所以我不能 100% 确定 hideMe 功能是如何工作的。
【解决方案2】:

我建议使用 Set、Map 或对象来跟踪您希望在单击按钮时隐藏的元素 ID。这提供了O(1) 查找需要隐藏的内容。请务必呈现您的 实际 文本而不是字符串文字,即 &lt;p&gt;{object.text}&lt;/p&gt;&lt;p&gt;object.text&lt;/p&gt;

class MyComponent extends React.PureComponent {
  state = {
    hidden: {}, // <-- store ids to hide
    objects: [],
    search: "",
  };

  // Curried function to take id and return click handler function
  hideThisDiv = id => () => {
    this.setState(prevState => ({
      hidden: {
        ...prevState.hidden, // <-- copy existing hidden state
        [id]: id // <-- add new id
      }
    }));
  }

  ...

  render() {
    const { hidden, objects } = this.state;

    return (
      <main>
        
        ...

        {objects
           .filter((el) => !hidden[el.uuid]) // <-- check id if not hidden
           .map(({ uuid, text }) => (
              <div key={uuid}>
                <button
                  type="button"
                  onClick={this.hideThisDiv(uuid)} // <-- attach handler
                >
                  Hide
                </button>
                <p>{text}</p>
              </div>
          ))}
      </main>
    );
  }
}

【讨论】:

  • 感谢您的回复,似乎这种过滤方式不起作用,因为UUID不能用作索引。另外,hideDiv 函数 'id' 变量会抛出一个隐含的无类型错误,有什么办法处理这个问题?
  • @IN1994MAR 为什么要使用 guid 作为索引?你能解释更多你的意思吗?您可能不想将数组索引与正在呈现的任何内容相关联,因为当您从正在映射的数组中删除元素时,这可能会导致 UI 更新问题。 hideThisDiv 看到的错误是什么?我在运行的沙箱中没有看到任何此类错误。你注意到它是一个柯里化函数吗?
  • 运行此行时'!hidden[el.uuid])' 我收到一个错误,el.uuid 不能用作输入类型,我在 HideThisDiv 看到的错误是第一个 id当我声明函数时抛出一个“参数“id”隐含地具有“任何”类型。什么是柯里化函数?
  • @IN1994MAR 听起来您正在使用打字稿(或 一些 类型的 JS 风格)。我不知道在这种模糊的上下文中,关于 el.uuid 的错误不能用作输入类型意味着什么。对于hideThisDiv,id 类型将是一个字符串。 Currying 是一种将采用多个参数的函数转换为采用单个参数的函数序列的方法。 onClick 回调接收一个事件对象,currying 允许我们以不需要匿名函数来传递我们关心的参数 uuid 的方式编写处理程序。
  • 是的,确实这是在打字稿中.. 已经在这个问题上工作了几个小时......
猜你喜欢
  • 2022-12-19
  • 2022-11-18
  • 2021-10-30
  • 2021-08-11
  • 1970-01-01
  • 2014-05-24
  • 2018-08-13
  • 1970-01-01
  • 2021-01-18
相关资源
最近更新 更多