【问题标题】:How can I set a randomized initial state using a conditional and React Hooks?如何使用条件和 React Hooks 设置随机初始状态?
【发布时间】:2026-01-06 11:30:02
【问题描述】:

此示例模拟抛硬币。
我想随机化硬币的初始状态。第一次加载页面时,它可能会显示头像。下一次,尾巴。为此,我使用由 Math 方法生成的随机数和基于随机数确定硬币面的条件(偶数表示正面,奇数表示反面)。
该值需要在初始渲染时显示。

我还想使用 React 的 Hooks 将值存储在状态中,以便稍后在我的应用程序中使用。如何使用钩子设置随机初始状态值?

这是我正在使用的代码。它目前不起作用,我不确定我做错了什么来实现我的目标:

import React, { useState } from 'react';
import './App.css';

function App() {

  const [coin, setCoin] = useState(randomizePlayer())

  const randomizePlayer = () => {
    let number = Math.floor(Math.random() * 10) + 1
    return (number % 2 === 0) ? setCoin('Heads') : setCoin('Tails')
  }

    return (
      <div className="App">
        The coin is showing {coin}
      </div>
    );
  }

export default App;

我是 hooks API 的新手,我正在使用这个练习来学习。

感谢任何帮助!

【问题讨论】:

  • 目前还不清楚它是如何工作的。在页面重新加载之间应该保留一个状态,对吗?那么你需要持久状态。这不是特定于钩子的。既然您是 hooks 新手,您将如何对 class 和 this.state 做同样的事情?
  • 嘿,埃斯图斯。我很感激你的回应!我明白我想要完成的可能不是最佳实践。我在 Jake Worth 的回答中添加了评论,我很好奇您对此的看法。
  • 我仍然不确定您到底想要完成什么。如果答案对您有用,那没关系,但这与您在问题中所说的不一致。你能提供一个例子来说明如何在没有钩子的情况下实现这个逻辑吗?这将使您清楚地了解您想要什么。

标签: reactjs state react-hooks


【解决方案1】:

我会重写这段代码如下:

const randomizePlayer = () => {
  const number = Math.floor(Math.random() * 10) + 1
  return (number % 2 === 0) ? 'Heads' : 'Tails'
}

function App() {
  const [coin, setCoin] = useState(randomizePlayer())

  return (
    <div className="App">
      The coin is showing {coin}
    </div>
  );
}

randomizePlayer 不需要调用setState;让它只返回一个值。 useState 可以使用该值作为其初始状态。

还要澄清一下:useState 只被调用一次。如果您希望 coin 具有不同的值,则使用此设置的方法是重新安装组件(重新加载页面)。

State hooks docs

【讨论】:

  • 这实现了我想要的(但是,由于它调用了函数,所以应该在 randomiziePlayer 函数之后声明硬币)。谢谢你的帮助!不过我很好奇。根据 estus 对该问题的评论,这不是最佳做法吗?
  • 我认为 estus 的问题暗示了这里的误解与钩子无关。在类组件中,您不会看到在 constructor 内部调用 setState,因为直接通过 this.state = 初始化状态是存在 constructor 的部分原因。引用 React 文档:“您不应该在构造函数()中调用 setState()。相反,如果您的组件需要使用本地状态,请直接在构造函数中将初始状态分配给 this.state”。 useState 是另一种初始化状态的方式,所以我不认为这是最佳实践。
  • 在分配coin 之前声明randomizePlayer,Jacob!由于该函数不再知道App 的状态,我们可以将它移到函数之外。已编辑。