您能解释一下,在一个点击处理程序中对不同的操作执行多个调度是不是一个好主意?每个分派都有一个函数,该函数从一个JSON文件中获取数据,并根据参数中的值输出过滤后的array.

const handleBtnClick = () => {
        dispatch({
            type: ACTIONS_CITY.CONVERT_CITY_NAME,
            payload: convertCityNameToCoordinates(value) //finds a city name and returns coordinates of the city
        })                                               

        dispatch({
            type: ACTIONS_CITY.CHANGE_REGION,
            payload: getRegion(value) //finds a city name and return its region
        })

        dispatch({
            type: ACTIONS_CITY.CHANGE_POPULATION,
            payload: getPopulation(value) //return a population of provided city
        })
}

100

export const cityReducer = (state, action) => {
    switch (action.type) {
        case (ACTIONS_CITY.CONVERT_CITY_NAME): {
            return {
                ...state,
                [state.cityCoordinates]: action.payload
            }
        }
        case (ACTIONS_CITY.CHANGE_POPULATION): {
            return {
                ...state,
                [state.population]: action.payload
            }

        }
        case (ACTIONS_CITY.CHANGE_REGION): {
            return {
                ...state,
                [state.region]: action.payload
            }
        }
        default:
            return state
    }
}

推荐答案

最佳实践之一是:

Avoid Dispatching Many Actions Sequentially

Avoid dispatching many actions in a row to accomplish a larger conceptual "transaction".这是合法的,但通常会导致多次相对昂贵的UI更新,并且一些中间状态可能会被应用程序逻辑的其他部分潜在地无效.更喜欢分派一个"事件"类型的操作,该操作同时导致所有适当的状态更新,或者考虑使用操作批处理插件来分派多个操作,最后只有一个UI更新.

原因1.多个状态更新会导致多个渲染.

如果您正在使用React<;18版本,并在setTimeout()promise.then(resolveCallback)中按顺序分派许多操作,则应该使用react-reduxbatch()个API,这些API使用的是React.unstable_batchedUpdates()个API,以允许将事件循环计时器中的任何react 更新批处理到单个呈现过程中.

因为handleBtnClick看起来像一个事件处理程序,所以您不需要使用batch()API.Reaction已经在内部将其用于其自己的事件处理程序回调.

原因2.中间状态

此外,概念上属于较大"事务"样式更新序列一部分的多个分派将导致可能不被视为有效的中间状态

如果我们可以更新一次状态,为什么我们要更新三次呢?

改进的方法是使用所有三个有效负载分派单个操作

import React from 'react';

const ACTIONS_CITY = {
    CONVERT_CITY_NAME: 'CONVERT_CITY_NAME',
    CHANGE_POPULATION: 'CHANGE_POPULATION',
    CHANGE_REGION: 'CHANGE_REGION',
    CHANGE_CITY: 'CHANGE_CITY',
};

const cityReducer = (state, action) => {
    switch (action.type) {
        case ACTIONS_CITY.CHANGE_CITY: {
            return {
                ...state,
                ...action.payload,
            };
        }
        case ACTIONS_CITY.CONVERT_CITY_NAME: {
            return {
                ...state,
                [state.cityCoordinates]: action.payload,
            };
        }
        case ACTIONS_CITY.CHANGE_POPULATION: {
            return {
                ...state,
                [state.population]: action.payload,
            };
        }
        case ACTIONS_CITY.CHANGE_REGION: {
            return {
                ...state,
                [state.region]: action.payload,
            };
        }
        default:
            return state;
    }
};

export default function App() {
    const [city, dispatch] = React.useReducer(cityReducer, { cityCoordinates: '100', population: 10000, region: 'japan' });
    console.log(city);
    const handleBtnClick = () => {
        dispatch({
            type: ACTIONS_CITY.CHANGE_CITY,
            payload: {
                cityCoordinates: '120',
                population: 20000,
                region: 'U.S',
            },
        });
    };

    return (
        <div className="App">
            <button onClick={handleBtnClick}>click me</button>
        </div>
    );
}

codesandbox

进一步阅读:Should I dispatch multiple actions in a row from one action creator?

Reactjs相关问答推荐

Reaction Native:在初始获取后,Reducer变为未定义

为什么我的标签在Redux API中不能正常工作?

使用`Link`包装`tr`标记会在Next.js中产生水合错误14

左边框不在图表中显示

试图从Amazon-Cogito-Identity-js模拟CogitoUser.authateUser,并将其获取为未定义的S

如何清除过滤器搜索的状态

通过createRoot创建的React元素无法调用Provider值

Mui Datepicker 设置了错误的日期

无法使用react-hook-form和react-places-autocomplete在字段中输入值

React 状态不更新

如何测试使用 React.createportal 呈现的组件?

将 ref 转发到所有页面(路由组件)只是为了将其应用于
并具有跳过导航链接(按钮).有没有更好的办法?

使用 React Router v6 监听来自不同组件的组件状态变化

React + i18next + Trans + Prettier:Prettier 最终会在重新格式化 JSX 时 destruct 翻译

如何向 surveyjs 调查添加多个结尾?

刷新页面时状态改变问题

如何在react 日历中自定义带有圆形边框的日期项?

react 路由路由加载器不适用于嵌套组件

如何通过 Material Ui 设计将 Accordion 添加到您的 React 项目中?

试图将页面限制为仅登录但有条件的用户似乎永远不会运行