javascript - 在 useEffect 挂钩内或返回渲染之前“执行任务”之间的区别
问题描述
我想知道在 useEffect 钩子内或在返回渲染之前“执行任务”有什么区别?
假设我作为道具发送的 Object {data} 在这两种情况下都是 { number1: 2, number2: 3 }
像:
import React from "react";
export default ({ data }) => {
let resultSum = 0;
let number1 = data.number1;
let number2 = data.number2;
resultSum = number1 + number2;
return <div>{resultSum}</div>;
};
或者像这样:
import React, { useState, useEffect } from "react";
export default ({ data }) => {
const [resultSum, setResultSum] = useState(0);
useEffect(() => {
let number1 = data.number1;
let number2 = data.number2;
setResultSum(number1 + number2);
}, []);
return <div>{resultSum}</div>;
};
在这两种情况下,页面都会将结果呈现为 5,并且在这两种情况下,任务都将在呈现页面之前处理......有什么区别?
谢谢
解决方案
主要区别在于,在第一种情况下,组件的第一次渲染直接返回值,并且不会自行重新渲染,因为没有状态更改。
在第二种情况下,有一个值为 0 的第一个初始渲染。
在第二种情况下,在返回之前做一个console.log
,你会注意到它。
在您的useEffect
组件挂载之后,但在第一次渲染之后调用回调。尽管您在视觉上看到的效果是相同的,但是useEffect
当您打算在组件安装后立即进行一些初始处理时,您应该考虑使用该方法,例如,从 API 获取一些数据。
在您的情况下,由于您只想基于道具进行一些计算(您的输出结果仅基于道具),因此您应该考虑直接返回它,因此最好使用第一种方法,因为您的组件是纯的(仅取决于道具上)。
推荐阅读
- json - 使用 jq,删除匹配正则表达式的键
- python - 如何缩小 Tweepy 中的搜索范围?
- c - 哈希表与链表
- node.js - 当我在 Flutter 中下载 mp3 文件时,我无法播放我下载的实际歌曲
- javascript - 为什么这个 import() 承诺在 require() 工作正常时被拒绝?
- python - 使用 getPerspectiveTransform 获取变换矩阵,然后用它来将单个点变换为扭曲空间
- json - 如何在laravel中显示查询中的数组
- python - 异常:在 python azure 功能应用程序中运行 Tabula-py 时出现 JavaNotFoundError
- matlab - 我的梯度下降函数出错:无法执行分配,因为左侧和右侧的元素数量不同
- excel - 从excel中的数据集(名称)中提取子集