React:如何在功能组件中强制状态更新?

车道

此功能组件具有一个调用的模板方法onChangeHandler,该方法接受一个select值并更新state问题是,state直到第二次调用render方法之后才更新,这意味着selected选项的state比的领先一步selectedRouteName

我知道类组件中可以使用生命周期方法来强制进行state更新,但是,如果可能的话,我希望将其保留为功能组件。

如代码中所述,的记录状态为selectedRouteDirection所选选项后面的一个值。如何强制将state其更新为功能组件中的正确值?

这个问题与命名类似的问题不同,因为我的问题询问的是我用例中的实际实现,而不是询问是否可能。

import React, { useState, Fragment, useEffect } from 'react';

const parser = require('xml-js');

const RouteSelect = props => {
    const { routes } = props;

    const [selectedRouteName, setRouteName] = useState('');
    const [selectedRouteDirection, setRouteDirection] = useState('');

    //console.log(routes);

    const onChangeHandler = event => {

        setRouteName({ name: event.target.value });

        if(selectedRouteName.name) {
            getRouteDirection();
        }
    }
/*
    useEffect(() => {
        if(selectedRouteName) {
            getRouteDirection();
        }
    }); */

    const getRouteDirection = () => {

        const filteredRoute = routes.filter(route => route.Description._text === selectedRouteName.name);
        const num = filteredRoute[0].Route._text;

        let directions = [];
        fetch(`https://svc.metrotransit.org/NexTrip/Directions/${num}`)
            .then(response => { 
                return response.text();
            }).then(response => {
                return JSON.parse(parser.xml2json(response, {compact: true, spaces: 4}));
            }).then(response => {
                directions = response.ArrayOfTextValuePair.TextValuePair;
                // console.log(directions);
                setRouteDirection(directions);    
            })
            .catch(error => {
                console.log(error);
            });

            console.log(selectedRouteDirection); // This logged state is one value behind the selected option
    }

    const routeOptions = routes.map(route => <option key={route.Route._text}>{route.Description._text}</option>);

    return (
        <Fragment>
            <select onChange={onChangeHandler}>
                {routeOptions}
            </select>
        </Fragment>
    );
};

export default RouteSelect;

好吧,实际上..即使我仍然认为效果是正确的方法..您console.log在错误的位置..fetch是异步的,并且您console.logfetch指令之后是正确的

由于@Bernardo状态.. setState也异步,因此在您调用时getRouteDirection();selectedRouteName可能仍具有先前状态。

因此要getRouteDirection();在设置状态后进行触发。您可以使用效果并将其selectedRouteName作为第二个参数传递(这实际上是一种优化,因此效果只有selectedRouteName在更改后才会触发

因此,这应该可以解决问题:

useEffect(() => {
  getRouteDirection();
}, [selectedRouteName]);

但是,如果您可以提供Stackblitz或类似产品,则可以在其中重现该问题。我们绝对可以为您提供更好的帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在 React 功能组件中立即更新状态?

如何从子功能组件更新 React 中的父状态?

如何在Typescript中编写React无状态功能组件?

React:如何在功能组件中创建状态相关函数?

如何更新 React JS 状态功能组件

如何在 React 中强制渲染组件

如何测试功能组件中的状态更新?(父组件中的状态,子组件中的更新逻辑)

如何在React Native的无状态功能组件中扩展Native组件的props TypeScript接口?

如何在React状态下更新单个属性(功能组件)

如何从 React 中的组件更新状态?

如何在reactjs中从父组件强制更新子组件

如何在REACT中从另一个同级或导入的组件更新同级组件的状态

如何在React组件中定义状态?

我们如何在React功能组件中的相同功能中获取更新的道具?

如何在React Native中从另一个功能组件更改一个功能组件的状态?

在异步功能后强制 React 组件更新?

如何在React代码中强制更新组件以将深色主题切换为浅色主题

如何在 React with Jest(无酶)中测试功能组件的状态

如何从 React 中的表单组件更新其他组件状态

React 功能组件不更新状态

如何在 Reactjs 中跟踪功能组件中的状态?

如何在 ReactJS 的功能组件中管理 4 Checkbox 的状态?

如何在单个文件中的功能组件之间传递状态

如何在React +发送参数中从子组件更新父状态

如何在集成测试中阻止未安装组件上的React状态更新?

如何在React JS中更新功能组件setState中整数数组的特定索引

如何在React中更新父状态

如何在React JS中更新状态

如何在 React 中更新 useReducer 状态?