每次单击时显示不同的组件(使用挂钩)

Posted

技术标签:

【中文标题】每次单击时显示不同的组件(使用挂钩)【英文标题】:to display a different component with each click (using hooks) 【发布时间】:2020-11-09 01:00:29 【问题描述】:

我想在每次点击 button 时显示不同的 component。 我确定syntax 是错误的,有人可以帮助我吗?浏览器不加载 我很想解释我哪里出错了

单击按钮后,一个组件(而不是 HomePage)应显示在 App component 上。帮助我理解正确的方法。

谢谢!

App.js

import React, useState from 'react';
import './App.css';
import Addroom from './components/Addroom.js'
import HomePage from './components/HomePage.js'

function App() 

  const [flag, setFlage] = useState(false);



  return (
    <div className="App">
     
      <h1>My Smart House</h1>

      <button onClick=()=>setFlage(flag:true)>Addroom</button>
      <button onClick=()=>setFlage(flag:false)>HomePage</button>


      setState(flag) && (
        <div><Addroom  index=i/></div>
      )
      !setState(flag) && (
        <div><HomePage index=i/></div>
      )
    </div>
  )

export default App;

主页

import React from 'react'

export default function HomePage() 
    return (
        <div>
            HomePage
        </div>
    )


地址

import React from 'react'

export default function Addroom() 
    return (
        <div>
            Addroom
        </div>
    )


【问题讨论】:

【参考方案1】:

我没有测试它,但我可以看到它应该是这样的:

<button onClick=()=>setFlage(true)>Addroom</button>
<button onClick=()=>setFlage(false)>HomePage</button>

  flag && (
    <div><Addroom index=i/></div>
  )
  !flag && (
    <div><HomePage index=i/></div>
  )

您需要使用 Boolean 的参数调用 setFlage 函数,说 truefalse,它会更改您要读取的 flag 变量。

【讨论】:

【参考方案2】:

试试下面的。

function App() 
  const [flag, setFlage] = useState(false);

  return (
    <div className="App">
      <h1>My Smart House</h1>

      <button
        onClick=() => 
          setFlage(true);
        
      >
        Addroom
      </button>
      <button
        onClick=() => 
          setFlage(false );
        
      >
        HomePage
      </button>
      flag ? <Addroom /> : <HomePage /> 
      
    </div>
  );



【讨论】:

flag ? &lt;Addroom /&gt; : &lt;HomePage /&gt; 这被称为Conditional (ternary) operator 它实际上是编写 if 语句的简写方式。【参考方案3】:

您缺少渲染方法,并且您应该使用 setState 进行反应性渲染。(当您使用状态变量并且一旦值更改渲染方法将重建输出,因此这将加载您的条件组件。

https://jsfiddle.net/khajaamin/f8hL3ugx/21/

--- html

class Home extends React.Component 
  constructor(props) 
    super(props);
  
  render() 
    return <div> In Home</div>;
  


class Contact extends React.Component 
  constructor(props) 
    super(props);
  
  render() 
    return <div> In Contact</div>;
  


class TodoApp extends React.Component 
  constructor(props) 
    super(props);
    this.state = 
      flag: false,
    ;
  

  handleClick() 
    this.setState((state) => (
      flag: !state.flag,
    ));
    console.log("hi", this.state.flag);
  

  getSelectedComp() 
    if (this.state.flag) 
      return <Home></Home>;
    
    return <Contact></Contact>;
  
  render() 
    console.log("refreshed");
    return (
      <div>
        <h1>
          Click On button to see Home component loading and reclick to load back
          Contact component
        </h1
        <button onClick=() => this.handleClick()>Switch Component</button>
        this.getSelectedComp()
      </div>
    );
  

ReactDOM.render(<TodoApp />, document.querySelector("#app"));

【讨论】:

谢谢,但我只想使用钩子 (:

以上是关于每次单击时显示不同的组件(使用挂钩)的主要内容,如果未能解决你的问题,请参考以下文章

React 状态数据未在第一个组件渲染时显示

UseState 仅在第二次单击时显示

[我想在VUE js中单击按钮时显示模态框

单击按钮时显示网络图像

获取 BootstrapVue 下拉菜单(b-dropdown)以在单击按钮时显示

等待带有 React Hooks 的 Redux Action