【问题标题】:How do I execute an async function that updates state when I instantiate a React component?如何在实例化 React 组件时执行更新状态的异步函数?
【发布时间】:2020-08-04 23:24:26
【问题描述】:

目前我有包含此位的 App.tsx。

<Route path="/car/:carModel" component={displayCarInfo} />

// @ts-ignore
const displayCarInfo = ({ match  }) => (
    <div>
        <CarInfoPage carModel={match.params.carModel}/>
    </div>
)

稍后在我的 CarInfoPage 组件中我有

let carModel  = props.carModel 
let [state, setState] = useState({carInfo : null, otherInfo: null})

async function getInfo(query : string) { 
    let carInfo = await GetCarInfo()   // make API call
    carInfo = processCarInfo()         // process data a little bit

    setState({                         // update state
            ...state,
            carInfo: carInfo
        })
}

如何在组件加载后运行getInfo() 函数以使state.carInfo 不是null

如果我在render() 之前运行该函数,则表明状态未更新。

【问题讨论】:

    标签: javascript reactjs typescript async-await react-component


    【解决方案1】:

    您可以将useEffect 挂钩与空依赖数组一起使用。

    let carModel  = props.carModel 
    let [state, setState] = useState({carInfo : null, otherInfo: null})
    
    async function getInfo(query : string) { 
      let carInfo = await GetCarInfo()   // make API call
      carInfo = processCarInfo()         // process data a little bit
    
      setState({                         // update state
        ...state,
        carInfo: carInfo
      });
    }
    
    useEffect(() => {
      getInfo(queryString);
    }, []); // <-- runs only once when component mounts
    

    注意:初始状态值 null,因此您可能需要在渲染任何内容之前进行一些 null 检查。

    【讨论】:

    • 谢谢,这是正确的策略。可能值得指出的是,由于我的 API 调用使用 async-await this article 关于使用 asyc-await 内部效果挂钩最终非常有用
    猜你喜欢
    • 2019-05-22
    • 2022-11-28
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多