javascript - React useState 导致渲染循环

标签 javascript reactjs infinite-loop

我正在获取数据并尝试使用 useState Hook 将响应存储在状态中。当我从 getRouteDirection 函数设置 selectedRouteDirection 时,渲染会无限循环运行。如何使用 useState 设置状态并仅渲染一次?

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('');

    useEffect(() => {
        if(selectedRouteName) {
            getRouteDirection();
        }
    });

    const onChangeHandler = event => {
        setRouteName({ name: event.target.value });
    }

    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 => { // offending block
                directions = response.ArrayOfTextValuePair.TextValuePair;
                // console.log(directions);
                setRouteDirection(directions);    
            })
            .catch(error => {
                console.log(error);
            });

        console.log(selectedRouteDirection);
    }

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

    return (
        <Fragment>
            <select onChange={onChangeHandler}>
                {routeOptions}
            </select>
        {selectedRouteName ? getRouteDirection() : null} 
        </Fragment>
    );
};

export default RouteSelect;

最佳答案

因为您在返回值中调用 getRouteDirection() ,所以应使用 useEffect 调用 getRouteDirection()

 ...

 useEffect(() => getRouteDirection());

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

解释:getRouteDirection()每次调用时都会更改状态,当状态更改时,这将导致调用getRouteDirection()再次,依此类推。

关于javascript - React useState 导致渲染循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59255873/

相关文章:

javascript - 将表单值发送到 chrome 扩展

reactjs - 如何使用ant和ReactJs将数据源的字段作为表行中onclick函数的参数传递?

string - 为什么在尝试将字符串添加到此字符串的末尾时,haskell 会停止?

Java 方法 while 循环无休止,即使似乎满足了突破情况

return - 无限循环中的返回和中断有什么区别?

javascript - 根据对象数组对字符串数组进行排序

javascript - Parse.com fetch collection 上限为 1000

javascript - JQuery append() 不追加

reactjs - Next-auth:尽管从 getServerSideProps 传递到页面的 Prop 未定义

javascript - 如何使用 React 从 API 调用中呈现多个项目