为了账号安全,请及时绑定邮箱和手机立即绑定

减速器函数被调用两次

减速器函数被调用两次

哆啦的时光机 2022-06-09 10:42:59
我正在练习 React 钩子,遇到了 useReducer 和 dispatch 函数的问题。当我在第二次点击任一按钮时,我创建的 reducer 函数被调用了两次。我的控制台日志输出在第一次单击任一按钮时打印一次,然后在每次按下按钮时打印两次。这是我的文件:实用程序.jsimport React, {createContext, useReducer, useContext} from 'react';const initialState = {    text: 0}const StoreContext = createContext(initialState);const reducer = (state, action) => {    console.log('hello');    switch(action.type) {        case 'add-counter': return {            ...state,            text: state.text + 1        }        default:            throw new Error();    }}export const StoreProvider = ({children}) => {    const [state, dispatch] = useReducer(reducer, initialState);    return (        <StoreContext.Provider value={{state, dispatch}}>            {children}        </StoreContext.Provider>    )}export const useStore = (store) => {    const {state, dispatch} = useContext(StoreContext);    return {state, dispatch};}用户列表.jsimport React, {useCallback} from 'react';import { Row, Col, Button } from 'antd';import TextDisplayComponent from './TextDisplay';import {useStore} from '../util';function ListComponent() {    const {dispatch} = useStore();    const increment = useCallback(() => dispatch({type: 'add-counter'}), [dispatch])    return (        <Row>            <Col span={12} style={{textAlign: 'center'}}>                <Button type="primary" onClick={increment}>Press Me</Button>            </Col>            <Col span={12} style={{textAlign: 'center'}}>                <TextDisplayComponent />            </Col>        </Row>    )}export default ListComponent;文本显示.jsimport React, {useCallback} from 'react';import {Button} from 'antd'import {useStore} from '../util'function TextDisplayComponent() {    const {state, dispatch} = useStore();    const increment = useCallback(() => dispatch({type: 'add-counter'}), [dispatch])    return (        <div>            {state.text}            <Button onClick={increment}>Add</Button>        </div>    )}有人可以帮忙吗?谢谢。完整的测试项目可以在https://github.com/Saro-DA/my-app.git找到
查看完整描述

1 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

那是故意的。您将应用程序包装在 中<React.StrictMode>,这将导致在开发模式下发生这种情况。

检查:

React Strict Mode 所做的另一件事是运行某些回调/方法两次(仅在 DEV 模式下)。你没看错!以下回调/方法将在严格模式下运行两次(仅在 DEV 模式下)


查看完整回答
反对 回复 2022-06-09
  • 1 回答
  • 0 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号