useState 不使用组件更新状态

时间:2021-03-02 13:19:11

标签: reactjs react-hooks use-state

我正在尝试在 React.js 上创建简单的计数器应用程序。我的代码如下所示:

对页

import React, { useState } from 'react';
import {Button} from '../components/Button/Button';

export const CounterPage = () => {
    const [counter, setCounter ] = useState(0);
    return (
        <>
            <div className="container" style = {{textAlign : 'center'}}>
                <h2>Counter Page</h2>
                <h3>{counter}</h3>
                <Button onClick = {() => setCounter(0)} value = 'reset' />
                <Button onClick = {() => setCounter(counter - 1)} value = '-'/>
                <Button onClick = {() => setCounter(counter + 1)}  value = '+'/> 
            </div>
        </>
    )
}

按钮组件

import React from 'react';
import styles from './Button.module.css';
export const Button = (props) => {
    return (
        <button 
            className = {props.value === '+' ? styles.addButton : styles.subButton} 
            type = "button"
        >{props.value}</button>
    )
}

我使用 useState 钩子来更新状态,但它不会更新状态。但如果我只使用

 <button onClick = {() => setCounter(0)}>reset</button>
  <button onClick = {() => setCounter(counter - 1)}>-</button>
  <button onClick = {() => setCounter(counter + 1)}>+</button>

代替

<Button onClick = {() => setCounter(0)} value = 'reset' />
  <Button onClick = {() => setCounter(counter - 1)} value = '-'/>
  <Button onClick = {() => setCounter(counter + 1)}  value = '+'/>

它有效。你能解释一下为什么吗?提前致谢。

2 个答案:

答案 0 :(得分:4)

由于您制作了自己的组件,因此您的 <Button> 组件也需要接受 proponClick

import React from 'react';
import styles from './Button.module.css';
export const Button = (props) => {
    return (
        <button 
            className = {props.value === '+' ? styles.addButton : styles.subButton} 
            type = "button"
            onClick={props.onClick}
        >{props.value}</button>
    )
}

就目前而言,在您的第二个代码块中,onClick 与任何东西无关...它只是一个从未被利用的道具,这就是它不起作用的原因。您使用 useStatesetCounter 的方式完全正确。

答案 1 :(得分:2)

您可以使用的另一种干净的方法是传播道具并添加到按钮中,这样您的 Button 组件就更具可配置性。

例如:

.....
<Button onClick = {() => setCounter(0)} className={styles.addButton}  />
<Button onClick = {() => setCounter(counter - 1)} className={styles.subButton} />
....

并在 Button 组件中

export const Button = ({value, ...buttonProps}) => {
    return (
        <button 
            {...buttonProps}, // here use the spread operator
            type = "button"
        >{value}</button>
    )
}

example here