【问题标题】:Using state to navigate to another React component使用状态导航到另一个 React 组件
【发布时间】:2020-09-01 14:42:22
【问题描述】:

我有一个简单的 React 应用来显示游戏。

它在页面顶部有 3 个按钮,用于控制用户在点击时可以去哪里,如下所示:

[Games]   |   [Create]    |    [Login]

对于我的 GamesList.js、CreateGame.js 和 LoginForm.js 组件。

导航是通过 React 钩子简单地控制的,如下所示:

// *** GamerPagesNavigation.js

const [showGames, setGames] = useState(true);
const [showCreate, setCreate] = useState(false);
const [showLogin, setLogin] = useState(false);


const handleGamesClick = useCallback(e => { (setCreate(false) || setLogin(false) ) || setGames(true) });
const handleCreateClick = useCallback(e => { (setGames(false) || setLogin(false) ) || setCreate(true) });
const handleLoginClick = useCallback(e => { (setCreate(false) || setGames(false) ) || setLogin(true) });

<div>
    {showGames && <GamesList />}
</div>
<div>
    {showCreate && <CreateGame />}
</div>
<div>
    {showLogin && <LoginForm />}
</div>

而且效果非常好! :)

所以效果很好!

但是现在,我的 LoginForm.js 组件上有一个用于登录的按钮。

提交并通过身份验证后,我希望将用户定向到登录页面。

但我不知道如何从 LoginForm.js 组件转到 CreateGame 组件。

因为我的状态是在 GamerPagesNavigation.js 组件中控制的,所以我不知道如何在另一个组件中获取状态值。

当我在我的 LoginForm.js 组件中尝试这个时,它说 showCreate 是未定义的:

setCreate(true)

我知道了,因为它是在不同的 React 组件文件中定义的。

那么有没有办法做到这一点?

谢谢! :)

【问题讨论】:

    标签: reactjs react-hooks react-component react-state-management


    【解决方案1】:

    通过 props 传递函数

        <LoginForm onLogin={() => setCreate(true)} />
    

    来自 LoginForm.js

    需要时致电props.onLogin()

    【讨论】:

    • 但是在 LoginForm.js 组件中,当我点击提交按钮时,我希望屏幕转到 CreateGame.js 组件...这样可以吗?谢谢!
    • 当然,如果您的想法是将导航集中到一个组件中,那么子组件应该通过回调调用它的父组件,这样状态只会存储到导航组件中。尽管我建议您使用 React 导航库,例如“react router”或“reach router”。这也会在您的应用程序中为您提供漂亮的 URL。
    • 好的,我做到了。但我的 GamerPagesNavigation.js 组件中的 onLogin{() => handleLoginClick()} 部分。然后我把 props.onLogin() 放在我的 const LoginForm = (props) => { } 部分。但什么也没有发生。 props.onLogin() 应该做些什么吗?我不熟悉它。谢谢!
    • 哦,我想我没有完全理解你想在这里做什么。所以你基本上想从一个孩子中运行 setCreate() 。我会更新我的答案。
    • 通过回调调用父函数,实际上是在父函数的上下文中执行的。
    【解决方案2】:
    const [showGames, setGames] = useState(true);
    const [showCreate, setCreate] = useState(false);
    const [showLogin, setLogin] = useState(false);
    
    
    const handleGamesClick = useCallback(e => { (setCreate(false) || setLogin(false) ) || setGames(true) });
    const handleCreateClick = useCallback(e => { (setGames(false) || setLogin(false) ) || setCreate(true) });
    const handleLoginClick = useCallback(e => { (setCreate(false) || setGames(false) ) || setLogin(true) });
    
    <div>
        {showGames && <GamesList />}
    </div>
    <div>
        {showCreate && <CreateGame />}
    </div>
    <div>
        {showLogin && <LoginForm handleCreateClick={handleCreateClick}/>}
    </div>
    

    然后在 LoginForm 内部对其进行解构

    const LoginForm = (props)=>{
     const {handleCreateClick}= props;
     const handleSubmit=()=>{
     // your form submission logic
     handleCreateClick()
    }
    return(
    <form onSubmit={handleSubmit}>
    //your form inputs 
    </form>
    )
    }
    

    【讨论】:

    • 谢谢,我按照你的建议做了所有事情,但我收到了这个错误:“handleCreateClick 不是函数”
    猜你喜欢
    • 2019-02-26
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    相关资源
    最近更新 更多