页面通过render渲染,通过setState改变数据但是页面并未改变

import React, { Fragment } from 'react';
import { useState } from 'react';
import './index.less';

export default function Guide() {

  const introArr = [
    {
      id: 0,
      className: 'stepA',
      show: true
    },
    {
      id: 1,
      className: 'stepB',
      show: false
    }
  ]
  const [list, setList] = useState(introArr);

  const nextStep = (index: number) => {
    console.log("INDEX", index)
    // 遍历 introArr, (index + 1)的设为true, 其他设为false
    list.map((item: any) => {
       return item.show = false;
    })
    list[index + 1].show = true
    // 更改 list 的值
    // 数组对象是引用方式,值都是地址,地址没有改变
    setList(list)
  }

  return (
    <Fragment>
      {/* 黑色遮罩层 */}
      <div className="mask"></div>
      {/* 引导区 */}
      <div className="searchTip">
        {
          list.map((item: any, index: number) => (
            item.show && 
              <div className = {list[index].className}>
                <a className = "nextStep" onClick = {() => nextStep(index)}>下一步</a>
                <span className = "close"></span>
              </div>
            )
          )
        }
          
      </div>
    </Fragment>
  );
}

解决方法:浅拷贝方式获取对象并修改再赋值。

const newList = [...list]

原因: 对象数组是引用方式 ,对于react来说它的值都是地址(涉及到tree diff),因为没有被重新赋值(地址没有改变),所以 react 会认为仍然是之前的元素(element),则不更新视图。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐