【问题标题】:I Want a Button that hide the div and restore it我想要一个隐藏 div 并恢复它的按钮
【发布时间】:2021-10-09 07:08:07
【问题描述】:

我想创建一个按钮来隐藏每张票和一个通用按钮来恢复它们。

这是代码:

return (
  <ul className="tickets">
    {filteredTickets.map((ticket) => (
      <li key={ticket.id} className="ticket">
        <h5 className="headline">{ticket.headline}</h5>
        <p className="text">{ticket.text}</p>
        <footer>
          <div className="data">
            By {ticket.address} | {new Date(ticket.time).toLocaleString()}
          </div>
        </footer>
      </li>
    ))}
  </ul>
);

【问题讨论】:

  • 已过滤的工单是您可以操作的数组吗?我的意思是你可以为数组的每个元素添加一个可见的布尔属性并使用它。您可以做的另一件事是使用两种状态,一种用于过滤数据,另一种用于恢复所有数据。在按钮中,您可以添加一个 onclick 事件和一个传递 id 或索引的 hideItem

标签: javascript html css reactjs


【解决方案1】:

这是您想要的示例! 您必须将按钮的 myFunction() 和 myDIV 替换为要隐藏它的元素!

<button onclick="myFunction()">Click Me</button>

    function myFunction() {
      var x = document.getElementById("myDIV");
      if (x.style.display === "none") {
        x.style.display = "block";
      } else {
        x.style.display = "none";
      }
    }

对于反应 = const [可见,setVisible] = useState(true) 这是按钮

【讨论】:

  • 它告诉我这个错误:类型'{孩子:字符串;点击:字符串; }' 不可分配给类型 'DetailedHTMLProps, HTMLButtonElement>'。类型“DetailedHTMLProps, HTMLButtonElement>”上不存在属性“onclick”。 TS2322
  • 好的,那么不要使用函数,而是使用 useState 进行反应并编写像这样的代码 const [visible, setVisible] = useState(true),对于 onCLick 按钮,写 onlick={() =>setVisible( !visible) } ,并使用 visible 作为隐藏或显示元素的逻辑
【解决方案2】:

这里有一个JS的demo,修改成你想要的样子

<ul class="ticket">
<li>
        <p>hey, I'm a P</p>
        <div class="data">I'm a Div</div>
      </li>
</ul>
.hide {display:none}

const generalBtn = document.getElementById(`btn`);
const divContainer = document.querySelector(`.ticket`);
const eachDiv = divContainer.getElementsByClassName(`data`);
generalBtn.addEventListener(`click`, () => {
  [...eachDiv].forEach((div) => {
    div.classList.toggle(`hide`);
  });
});

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
【解决方案3】:

您的情况有一个很好的解决方案,但正如 cmets 中所述,它需要操作 filteredTickets 数组。

您需要为filteredTickets 的每个项目添加一个属性/值来跟踪或更改它们的状态。例如,它可以是 isVisible 属性,它是一个带有 falsetrue 值的布尔值。

现在,isVisible 值将决定行为。让我们修改票:

const handleHideTicket = (id) => {
  // find selected ticket and ​change its visibility
 ​const updatedFilterdTickets = filteredTikcets.map(ticket => (ticket.id === id ? {...ticket, isVisible: false} : ticket))
 // now the updatedFilterdTickets need to be set in your state or general state like redux or you need to send it to the server throw a API calling.
}


return (
 ​<ul className="tickets">
   ​{filteredTickets.filter(ticket => ticket.isVisible).map((ticket) => (
     ​<li key={ticket.id} className="ticket">
       ​<h5 className="headline">{ticket.headline}</h5>
       ​<p className="text">{ticket.text}</p>
       ​<footer>
         ​<div className="data">
           ​By {ticket.address} | {new Date(ticket.time).toLocaleString()}
         ​</div>
         // add a button to control visibility of each ticket
         ​<button onClick={() => handleHideTicket (ticket.id)}> click to hid / show </button>
       ​</footer>
     ​</li>
   ​))}
 ​</ul>
);

解释:

一个新的button 添加到每张票,并将handleHideTicket 处理程序传递给它。如果用户单击此按钮,处理程序会找到该票并将isVisible 属性设置为false

另一方面,我们可以通过在map 方法之前应用一个简单的filter 方法来删​​除隐藏的票证。所以只会显示可见的门票。

现在,创建一个通用按钮来显示所有门票。在这种情况下,您需要一个处理函数,将所有票证的isVisible 值设置为true

const handleShowAllTickets = () => {
  const updatedFilteredTickets = filteredTickets.map(ticket => ({...ticket, isVisible: true}))
  // now put the updatedFilteredTickets in your general store/post an API call/ update state 
}

注意:正如我在代码的 cmets 中提到的,您需要在通过处理程序更改后更新您的 filteredTickets 数组以反映元素的更改。

【讨论】:

  • 我已经尝试过您的解决方案,它向我显示了这个错误:./src/App.tsx SyntaxError: C:\projects\fed-entry-level-exam\client\src\App.tsx : 意外字符 '​' (37:3) 35 | 36 | const handleHideTicket = (id) => { > 37 | ​const updatedFilterdTickets = filteredTickets.map | ^ 38 | (ticket => ticket.id === id ? {...ticket, isVisible: false} : 票) 39 | } 40 |
  • 请再次检查代码,我已经更新了我的代码片段并添加了“(”用于从地图@daniel 重新执行
  • ./src/App.tsx 语法错误:';'预计 (75:10)
  • 我无法以这种方式调试,忘记实现,它可能不是您项目中需要的确切代码,我希望您能得到我的想法和过程来实现@daniel,因为你是 React 的新手,我试图用代码中的 cmets 解释每一行代码,并额外解释以澄清答案。随时询问有关上述答案的任何问题。请仔细阅读并尝试逐步完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多