在js中使用useStates反应如何一次显示一个div

Posted

技术标签:

【中文标题】在js中使用useStates反应如何一次显示一个div【英文标题】:using useStates in js react how to display one div at a time 【发布时间】:2021-11-26 09:17:47 【问题描述】:

我有 3 个 div 和 3 个通过样式组件创建的按钮是 react js,我想知道如何在页面加载时默认显示一个 div,以及当用户单击其他两个按钮时我想要那个 div使用 useStates 显示和其他 div 消失。

这就是我想创建useState和一个参数为“displayDiv”的函数 并且可能通过单击其中一个按钮将选定的 div 作为参数传递,但我不知道该怎么做。

const Maincontainer = styled.div`
    border: 1px solid black;
`
const Divbtncontainer = styled.div`
    border: 1px solid black;
    display: flex;
    justify-content: center;
`
const Div1btn = styled.button`
    border-radius: 20px;
    margin-right: 10px;
    background: #D3D3D3;
    width: 15%;
    cursor: pointer;
    &:hover
        background: #1B1212;
        color: cyan;
        transition: ease-in-out 0.3s;
    
`
const Div2btn = styled.button`
    border-radius: 20px;
    margin-right: 10px;
    background: #D3D3D3;
    width: 15%;
    cursor: pointer;
    &:hover
        background: #1B1212;
        color: cyan;
        transition: ease-in-out 0.3s;
    
`
const Div3btn = styled.button`
    border-radius: 20px;
    margin-right: 10px;
    background: #D3D3D3;
    width: 15%;
    cursor: pointer;
    &:hover
        background: #1B1212;
        color: cyan;
        transition: ease-in-out 0.3s;
    
`
const Divscontainer = styled.div`
    display: flex;
    justify-content: center;

`
const Div1 = styled.div`
    text-align: center;
    border: 1px solid black;
`
const Div2 = styled.div`
    text-align: center;
    border: 1px solid black;
`
const Div3 = styled.div`
    text-align: center;
    border: 1px solid black;
`


    function App() 
     const [visableDiv, setVisableDiv] = useState();   
            function setDivToVisable(displayDiv)
                setVisableDiv(displayDiv)
            
                  <Maincontainer>
                    <Divbtncontainer>
                        <Div1btn>
                            Div 1
                        </Div1btn>
                        <Div2btn>
                            Div 2
                        </Div2btn>
                        <Div3btn>
                            Div 3
                        </Div3btn>
                    </Divbtncontainer>
                    <Divscontainer>
                        <Div1>
                            <h2>This is div 1 </h2>
                        </Div1>
                        <Div2>
                            <h2>This is div 2 </h2>
                        </Div2>
                        <Div3>
                            <h2>This is div 3 </h2>
                        </Div3>
                    </Divscontainer>
                </Maincontainer>
    
    

【问题讨论】:

您是否尝试过对所选 div 进行条件渲染?您能否为您尝试过的内容提供更完整/全面的代码示例? 以下是正确执行此操作的方法,无需重复代码:codesandbox.io/s/elastic-microservice-dqtdw?file=/src/App.js 【参考方案1】:

您可以使用条件渲染进行管理。

 function App() 
  const [visableDiv, setVisableDiv] = useState("Div 1");

  const setDivToVisable = (displayDiv) => 
    setVisableDiv(displayDiv);
  ;

  <Maincontainer>
    <Divbtncontainer>
      <Div1btn onClick=() => setDivToVisable('Div 1')>Div 1</Div1btn>
      <Div2btn onClick=() => setDivToVisable('Div 2')>Div 2</Div2btn>
      <Div3btn onClick=() => setDivToVisable('Div 3')>Div 3</Div3btn>
    </Divbtncontainer>
    <Divscontainer>
      visableDiv === "Div 1" && (
        <Div1>
          <h2>This is div 1 </h2>
        </Div1>
      )
      visableDiv === "Div 2" && (
        <Div2>
          <h2>This is Div 2 </h2>
        </Div2>
      )
      visableDiv === "Div 3" && (
        <Div3>
          <h2>This is div 3 </h2>
        </Div3>
      )
    </Divscontainer>
  </Maincontainer>;

【讨论】:

这个方案不遵循DRY原则; OP 有很多重复的代码应该被消除。添加第四个 div 需要复制粘贴一个部分,这也是不好的做法。 同意,很多代码是重复的,需要重构你在评论中提到的击球方式codesandbox.io/s/elastic-microservice-dqtdw?file=/src/App.js【参考方案2】:

没有重复代码,您可以添加任意数量的 div:


import useState  from 'react'
const divs = [
  <div>
      <h2>This is div 1 </h2>
  </div>,
  <div>
      <h2>This is div 2 </h2>
  </div>,
  <div>
      <h2>This is div 3 </h2>
  </div>,
];
export const App= () => 
  const [visibleDivIndex, setVisibleDivIndex] = useState(0);

  return (
      <div>
          <div id="container">
              divs.map((_, index) => (
                  <button onClick=() => setVisibleDivIndex(index)>
                      Div index + 1
                  </button>
              ))
          </div>
          <div>divs[visibleDivIndex]</div>
      </div>
  );
;

【讨论】:

【参考方案3】:

您可以将 div 放入数组中,在选定的索引处渲染 div(默认为 0),然后在单击按钮时更改索引。

const elements = [
    <Div1>
        <h2>This is div 1 </h2>
    </Div1>,
    <Div2>
        <h2>This is div 2 </h2>
    </Div2>,
    <Div3>
        <h2>This is div 3 </h2>
    </Div3>,
];

function App() 
    const [index, setIndex] = useState(0);

    function clickHandler(index) 
        return () => setIndex(index);
    

    return (
        <Maincontainer>
            <Divbtncontainer>
                <Div1btn onClick=clickHandler(0)>
                    Div 1
                </Div1btn>
                <Div2btn onClick=clickHandler(1)>
                    Div 2
                </Div2btn>
                <Div3btn onClick=clickHandler(2)>
                    Div 3
                </Div3btn>
            </Divbtncontainer>
            <Divscontainer>
                elements[index]
            </Divscontainer>
        </Maincontainer>
    );

有更好和更可扩展的方法来做这种事情,但它们不太适合您的示例,因为您在每个位置都使用独特的组件。我不确定为什么 Div2btnDiv3BtnDiv2Div3Div1btnDiv1 相同时存在。

【讨论】:

以上是关于在js中使用useStates反应如何一次显示一个div的主要内容,如果未能解决你的问题,请参考以下文章

我正在学习反应,我的代码运行良好,但我如何才能一次性声明 currDate 以在全局范围内使用它以在 useState 中使用

如何在反应js中显示来自firebase存储的所有图像

反应 useState 钩子不使用 axios 调用更新

反应钩子useState()的真正奇怪的行为

如何在反应中使用带有useState钩子的回调[重复]

如何在反应中使用 setInterval?