首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >集合和渲染在反应中

集合和渲染在反应中
EN

Stack Overflow用户
提问于 2021-05-07 16:44:35
回答 2查看 386关注 0票数 1

ChooseElements组件呈现列表元素

根据每个列表项的状态,项目将以不同的方式显示。

如果发生单击事件,则toggleItem函数为每个元素设置一个新的状态。

为什么使用const selectedItems = new Set(activeItems)

立即呈现更改。

但使用const selectedItems = activeItems

更改将在第二次重呈现后显示?

代码语言:javascript
复制
export default function ChooseElements() {
  const [activeItems, setActiveItems] = useState(new Set())

  const toggleItem = (id) => {
    const selectedItems = new Set(activeItems)
    if (selectedItems.has(id)) {
      selectedItems.delete(id)
    } else {
      selectedItems.add(id)
      console.log(selectedItems.add(id))
    }
    setActiveItems(selectedItems)
  }

  const listItems = elementObjects.map((object) => (
    <ListItem
      key={object.id.toString()}
      value={object.Element}
      isActive={activeItems.has(object.id)}
      clickItem={() => toggleItem(object.id)}
    />
  ))

  return (
    <div>
      <button onClick={() => console.log(activeItems)}>gets sets</button>

      <ul>{listItems}</ul>

      <button
        onClick={() => {
          /*  with button click get all list items with specific class! */
          console.log(elementObjects.filter((o) => activeItems.has(o.id)))
        }}
      >
        get Elements
      </button>
    </div>
  )
}

子组件

代码语言:javascript
复制
import React, { useState, useEffect } from 'react'

import './styles/choose-elements.css'

const elementObjects = [
  { id: 1, Element: 'element-1' },
  { id: 2, Element: 'element-2' },
  { id: 3, Element: 'element-3' },
  { id: 4, Element: 'element-4' },
]

function ListItem({ isActive, clickItem, value }) {
  return (
    <li className={isActive ? 'selected' : null} onClick={clickItem}>
      {value}
    </li>
  )
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-07 16:59:54

这相当简单。每次执行setActiveItems()时,react都会检查以前状态和当前状态的值。

当您使用const selectedItems = new Set(activeItems)时,它会在新的地址空间中创建selectedItems。因此,使用此状态进行更新将触发重新呈现。(在另一种情况下,地址空间保持不变)

我将进一步说明这一点:

代码语言:javascript
复制
const arr1 = ["foo"];
const arr2 = arr1;

arr2.push("bar");
console.log(arr1 === arr2); // new elements are pushed but address remains the same

我建议您阅读更多关于JS中浅层和深拷贝的内容,以及react如何决定何时重新呈现其组件。

票数 1
EN

Stack Overflow用户

发布于 2021-05-07 16:56:57

哦,您正在使用activeItems创建new Set(),所以当您执行activeItems.add时,您正在改变您的现有状态。如果执行setActiveItems(selectedItems),react将不会检测到您已经更新了it事件。因为selectedItems引用了与activeItems相同的对象,所以只需要比较类似于引用的对象

if (obj1 !== obj2) {//run re-render cycle}

因此,在更新状态时,应该创建新集。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67438807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档