微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我是否必须担心 useState 会导致重新渲染?

如何解决我是否必须担心 useState 会导致重新渲染?

注意:我在 wordpress.stackexchange 上问过这个问题,但那里没有得到任何回应,所以在这里试试。

我不确定这是特定于 wordpress 的、特定于 wordpress 的重载 React 还是 React,但我正在为 wordpress 创建一个新的块插件,如果我在其 {{1} } 函数页面被重新渲染,即使我从不调用 setter 函数

useState

如果我注释掉 edit,那么 import { useState } from '@wordpress/element'; export default function MyEdit( props ) { const { attributes: { anAttribute },setAttributes,} = props; const [ isValidating,setIsValidating ] = useState( false ); const post_id = wp.data.select("core/editor").getCurrentPostId(); console.log('Post ID is ',post_id); const MyPlaceholder = () => { return( <div>this is a test</div> ); }; const Component = MyPlaceholder; return <Component />; } 会发生一次。如果我把它留在里面,它会发生两次;即使我从不检查 const [ isValidating,setIsValidating ] = useState( false ); 的值,也不要介意调用 console.log。我不想过度优化事物,但同样地,如果我在页面上使用此块 isValidating 次,页面将被呈现 setIsValidating 次。它只是在管理方面,因为它在 n 中,所以也许没什么大不了的,但是......似乎不对。这是 2n 的预期行为吗?难道我做错了什么?我是否必须担心它(从速度的角度来看,从潜在的竞争条件,因为一切都被多次重新渲染)?

解决方法

是的,您必须担心总是放置一个依赖项数组,这样它就不会重新渲染,根据您的查询,假设正在计划编辑一个字段,这里是示例代码

const [edit,setEdit]= useState(props);

useEffect(() => {
// logic here
},[edit])

[edit] 将检查是否有任何更改,并据此更新 DOM,如果您不放置任何 [](依赖项数组),它将始终进入无限循环,

,

我想这是预期的行为。如果我向使用 console.log 的原生核心块添加类似的 useState,我会得到相同的效果。似乎 WordPress 使用 use strict 运行,并且根据 this answer,React 在严格模式下会双重调用许多东西。

,

在您的示例代码中,每次都会立即评估 console.log 语句并触发块的重绘/重新渲染。移除 console.log 后,只有状态更改才会触发重新渲染。

由于 Gutenberg 编辑器基于 Redux,如果状态发生变化,任何依赖于该状态的组件都会重新渲染。当在编辑器中选择一个块时,所选块将同步渲染,而编辑器中的所有其他块则异步渲染。 WordPress Gutenberg 开发人员意识到重新渲染是一种performance concern,并已采取措施减少重新渲染。

从 wp.data 请求数据时,应该使用 useEffect() 来安全地等待异步数据:

import { useState,useEffect } from '@wordpress/element';

    export default function MyEdit(props) {
    ...
    const [curPostId,setCurPostId] = useState(false);

    useEffect(() => {
        async function getMyPostId() {
            const post_id = await wp.data.select("core/editor").getCurrentPostId();
            setCurPostId(post_id);
        }
        getMyPostId();
    },[]); // Run once

    const MyPlaceholder = () => {
        return (
             <div>Current Post Id: {curPostId}</div>
        );
    };

    const Component = MyPlaceholder;

    return <Component />;
}

正如问题中提到的,useState() 在核心块中用于设置和更新状态。状态钩子是在 React 16.8 中引入的,它是最近发生的变化,您可能会遇到较旧的古腾堡代码示例,它通过类构造函数设置状态并且不使用钩子。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。