【问题标题】:show only one element and rest should reset in react js仅显示一个元素,其余部分应在 react js 中重置
【发布时间】:2021-09-01 09:23:55
【问题描述】:

在 useState 挂钩的帮助下,尝试仅显示 div 的一个元素并重置数组中的所有其他元素。

我以布尔数组的形式创建了一个初始状态,表示每个元素的显示值(true 表示显示,false 表示隐藏)。在每个元素上传递一个 onClick 事件处理程序,这会将数组的所有值更改为 true,并将唯一在其索引处单击的元素更改为 false。我附上了下面的代码。此外,props.id 包含组件的索引/键。

代码

import React,{useState} from "react";
import myComponent from "./Components/myComponents.js";

const Add = (props) =>{
    const [showVals,changeShowVals]=useState([true,true,true,true,true,true,true]);

    const displayHandler=(id)=>{
        const x=id;
        const vals=new Array(7).fill(true);
        vals[x]=!vals[x];
        changeShowVals(vals);
    }
    return(
        <div>
            {showVals[props.id]?
                <myComponent onClick={()=>displayHandler(props.id)}/>:null}
        </div>
    );
}

export default Add;

【问题讨论】:

  • 您需要在点击时隐藏组件。是吗?
  • 如果我的理解正确,您希望在props.id 位置显示数组中的组件之一。您的代码应该在您单击它时将其隐藏,看起来它已经在执行此操作,并且任何先前单击的元素都将重置为 true(如图所示)。你的标题说“只显示一个元素,其余的应该隐藏”,而你在谈论你的问题中的“唯一点击的元素”。你想达到什么目的?
  • 是的,我想显示点击的组件并重置之前点击的元素。
  • 这个解决方案的问题是,当我点击第一个显示/隐藏按钮时,它会显示正确的组件,但是当我点击第二个显示/隐藏按钮时,它应该隐藏第二个组件并显示第一个组件,在这种情况下它似乎没有这样做。 @SarunUK
  • 是的,我马上给你提供

标签: javascript reactjs


【解决方案1】:

根据您的代码更新了答案。

您没有为Red 组件定义点击处理程序。

我的组件:-

import React from "react";

function MyComponent({ onClick, number }) {
  const style = {
    height: "20px",
    width: "20px",
    backgroundColor: "red",
    margin: "4px",
    cursor: "pointer"
  };

  return (
    <div onClick={() => onClick(number)} style={style}>
      {number}
    </div>
  );
}
export default MyComponent;

应用组件:-

 import React, { useState } from "react";
    import Red from "./red";
    import Green from "./green";
    
    const App = () => {
      const [showVals, changeShowVals] = useState([
        true,
        true,
        true,
        true,
        true,
        true,
        true
      ]);
    
      const displayHandler = (index) => {
        const vals = new Array(7).fill(true);
        vals[index] = !vals[index];
        changeShowVals(vals);
      };
    
      const number = [0, 1, 2, 3, 4, 5, 6];
      return number.map((ele, i) =>
        showVals[i] ? (
          <div onClick={() => displayHandler(ele)}>
            <Red number={ele} key={ele + " red"} />
          </div>
        ) : (
          <Green number={ele} key={ele + " green"} />
        )
      );
    };
    export default App;

代码沙盒 - https://codesandbox.io/s/material-demo-forked-8lgc7?file=/App.js:0-684

【讨论】:

  • codesandbox.io/s/material-demo-forked-s1kdo?file=/App.js 我做了一些更改,我想点击红色组件,这样它就会变成绿色,如果点击任何其他红色组件,之前的绿色组件应该变成红色,点击的组件应该变成绿色。
  • 原因是您没有为 Red 组件定义点击处理程序。更新了答案
  • 这是否意味着在尝试处理事件侦听器时我必须为每个组件制作一个额外的 div?
  • 您的组件应该处理这个问题 --> return
    {props.number}
    - 在Red 组件内添加一个点击处理程序
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-10
  • 2021-12-14
  • 1970-01-01
相关资源
最近更新 更多