React项目中,Antdesign的Tab组件,状态更新,视图没有更新问题

修改前:

import React, { useEffect, useState } from 'react';
import { Button,Tabs } from 'antd';

const App: React.FC = () => {
  interface A{
    label: string,
    key: string,
    children: JSX.Element,
  }
  const [num,setNum]=useState(0)
  const [content,setContent]=useState<A[]>([
    {
      label: 'Tab 1',
      key: '1',
      children: <div>{num}<div onClick={()=>changeNum()}>你好呀!</div></div>,
    }
  ])
  const changeNum=()=>{
    setNum(num+3)
  }
  return (
    <>
        <Tabs
            defaultActiveKey="1"
            items={content}
        />
        <div>
            {num} --- <Button type="primary" onClick={()=>setNum(num+1)}> Log in </Button>
        </div>
    </>
  );
};

export default App;

在这段代码中,num 状态变量的值发生变化,但视图没有更新。这可能是因为在渲染组件时,子组件 Tabsitems 属性接收的是一个状态变量 content 的引用,而 content 本身并没有发生变化。为了解决这个问题,可以在 setContent 中使用函数式更新来确保每次更新 num 时,content 也会重新计算。 

修改后:

import React, { useEffect, useState } from 'react';
import { Button,Tabs } from 'antd';

const App: React.FC = () => {
  interface A{
    label: string,
    key: string,
    children: JSX.Element,
  }
  const [num,setNum]=useState(0)
  const [content,setContent]=useState<A[]>([
    {
      label: 'Tab 1',
      key: '1',
      children: <div>{num}<div onClick={()=>changeNum()}>你好呀!</div></div>,
    }
  ])
  const changeNum=()=>{
    setNum(num+3)
  }
  useEffect(()=>{
    setContent((prevContent) => [
      {
        ...prevContent[0],
        children: (
          <div>
            {num}
            <div onClick={() => changeNum()}>你好呀!</div>
          </div>
        ),
      },
    ]);
  },[num])
  return (
    <>
        <Tabs
            defaultActiveKey="1"
            items={content}
        />
        <div>
            {num} --- <Button type="primary" onClick={()=>setNum(num+1)}> Log in </Button>
        </div>
    </>
  );
};

export default App;

在修改后的代码中,我们使用 useEffect 钩子监听 num 的变化,并在 num 变化时更新 content 的值,以确保视图能够正确更新。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值