【问题标题】:How to perform a side effect after another side effect rendered a react component如何在另一个副作用呈现反应组件后执行副作用
【发布时间】:2019-11-16 16:54:38
【问题描述】:

我有以下简单的用例: 组件ServerRendered 用于呈现使用属性url 从服务器检索的标记。在ServerRendered 中,我使用 useEffect 从后端加载标记,将状态设置为当前标记并将其呈现在 div 中。 属性init 可选地指定在呈现标记后应该执行的函数。 渲染标记后如何运行 init 函数?

/* eslint-disable react/no-danger */

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

type ServerRenderedPropsType = {
    url: string,
    init?: () => void,
};

function ServerRendered(props: ServerRenderedPropsType) {
    const [html, setHtml] = useState('');
    useEffect(() => {
        async function fetchData() {
            const result = await axios(props.url);
            setHtml(result.data.title);
        }
        fetchData();
    }, [props.url]);

    return <div dangerouslySetInnerHTML={{__html: html}} className="serverRendered" />;
}

export default ServerRendered;

【问题讨论】:

    标签: reactjs use-effect


    【解决方案1】:

    当你收到你的数据时,你只需要做另一件事

    import React, {useState, useEffect, useCallback} from 'react';
    import axios from 'axios';
    
    type ServerRenderedPropsType = {
        url: string,
        init?: () => void,
    };
    
    function ServerRendered(props: ServerRenderedPropsType) {
        const [html, setHtml] = useState('');
        const fetchData = useCallback(async () => {
            const result = await axios(props.url);
            setHtml(result.data.title);
          }, [props.url])
    
        useEffect(() => {
            fetchData();
        }, [fetchData]);
    
        useEffect(() => {
          // do what you want here
          if (!html) return;
          props.init()
        }, [html])
    
        return <div dangerouslySetInnerHTML={{__html: html}} className="serverRendered" />;
    }
    
    export default ServerRendered;
    

    【讨论】:

    • 我明白了,但是在标记已经渲染之前不会触发第二个效果吗?
    • 不会在html更新的同时渲染,但是你可以在你的效果中添加if (!html) return
    • 我刚刚在我的示例应用程序中进行了双重检查,第二次使用效果将被调用两次:第一次在标记渲染之前(html===''),然后在渲染之后再次调用。
    猜你喜欢
    • 2017-01-28
    • 2021-02-21
    • 2018-07-16
    • 2023-03-11
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    相关资源
    最近更新 更多