reactjs - react Hook UseEffect 与类名

是否无法在重新渲染时更新类名?

const [selected, setSelectedState] = useState(true);

let className = "none";
useEffect(() => {
    className = "appointment-item " + (selected ? "selected" : "");
    console.log(className );
}, [selected] );


return (
  <div className={`${className}`} onClick={()=>setSelectedState(!selected)}>{Math.random()}</div>
);
控制台中的

className 显示正确,但是当 div 重新呈现时(我看到这是因为随机数更新),className 保持为“无”。我也很困惑,因为我认为 useEffect 也会立即运行。所以它一开始就不应该是“无”,因为它应该立即被覆盖?

最佳答案

要添加有关@MarkoCen 答案的更多详细信息(这是正确的),在使用钩子(Hook)时需要了解一些事情:

  • useEffect 在每次渲染之后 运行。

  • 在每次渲染时,组件都会在钩子(Hook)定义之后从头开始重新执行。鉴于您的代码(我在每个周期都添加了注释以识别)

const [selected, setSelectedState] = useState(true); // 0

let className = "none"; // 1

useEffect(() => { 
    // 3
    className = "appointment-item " + (selected ? "selected" : "");
    console.log(className );
}, [selected] );

// 2
return (
  <div className={`${className}`} onClick={()=>setSelectedState(!selected)}>{Math.random()}</div>
);

以下是循环顺序:

第一次渲染:

  • 0:使用状态

  • 1: 类名 = 无

  • 2:使用 className = none 渲染

  • 3:使用效果

重新渲染:

  • 1: 类名 = 无

  • 2:使用 className = none 重新渲染

  • 3:使用效果

如您所见,每次渲染都将 className 设置为“none”,因此您永远不会得到您期望的结果。

关于reactjs - react Hook UseEffect 与类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60892197/

相关文章:

python - 导入错误 : cannot import name 'CONTRACTION_MA

vue.js - Vue - 在 Chrome 开发工具中显示错误行

list - Prolog 从列表中删除元素

css - Vuetify v-card 适合拼图(砌体布局)

html - 如何为本地文件设置背景图片url?

reactjs - 在 React 中使用另一个上下文中的上下文

vue.js - 如何在组件内导出和导入多个函数?浏览器

reactjs - 在创建或处理 React 应用程序时,我是否需要始终连接到互联网?

hyperledger-fabric - fabric-chaincode-go 和 fabric-

amazon-web-services - 卷 IOPS、卷吞吐量 (MiB/s) 和网络 (Gbp