当用户单击一个按钮时,我正在运行一个函数,该函数更新我的useState并向其中添加一个数组作为数据.该数据稍后被传递到另一个网页,在该网页中,数组对象以不同的方式显示.我遇到了一个问题,我的useState没有更新,而是返回一个空array.我怀疑这与新页面刷新而不是更新useState有关.我只是不确定从这里到哪里go .

为此,我使用了Reaction-Router V6

这是我的父母网页和按钮.

<div className="toggleButtons" key={id}>
  <Link
    to={"/DetailsPage"}
    onClick={toggledItem}
    state={{ data: data }}
    className="primary-ff boxyButton"
  >
    {buttonText}
  </Link>

  <a href={link} className="icon-link" target="_blank">
    <i className="fa-solid fa-arrow-up-right-from-square"></i>
  </a>
</div>

下面是我try 将数组列表传递到我的useState

const softiesInfo = pageContentList.find(({id}) => id == 1);
const palcoInfo = pageContentList.find(({id}) => id == 2);
const tlaxInfo = pageContentList.find(({id}) => id == 3);

const [data, setData] = useState({})

const toggledItem = () => {
  if (id === 1) {
    setData(softiesInfo);
  } else if (id === 2) {
    setData(palcoInfo)
  } else {
    setData(tlaxInfo)
  }
};

这是我的数据应该在我的第二页上呈现的地方.

export default function DetailsPage() {
  const location = useLocation();
  const data = location.state;
  return (
    <div className="header-wrap">
      <h1 className="primary-ff">{data.title}</h1>
      <img src={data.logoImg} alt={data.altLogo} />
    </div>
  )
});

我试着像这样将数据强制输入到我的useState中,结果成功了,但我认为它不是很高效,可以算作编写干净的代码.

const [data, setData] = useState({
  sectionName: "softies-section",
  title: "Softies Ice Cream-Under The Scoop",
  logoImg: softieslogo,
  altLogo: "softies-logo",
  img: softiesPlanner,
  altImg: "Career Day At Pinnacle",
  img2: softiesAccordion,
  constrainContent:
    "lorem a;sdkfj;alskdjfa lksdfjlaksjdl;fkjasldk;fjaslkdfjal;sdkjfalksdjf;laks;dj asflsngealj    sflsdajflkads",
  id: 1,
});

推荐答案

Issue

这里的问题是,当单击Link组件时,它会影响导航动作immediately,而传递的state属性将包括链接被单击的data值是103的任何内容.

DetailsPage也没有访问传递的状态引用data属性,它只声明了一个名为data的局部变量,并将其设置为值location.state.DetailsPage需要访问data.data.title才能获得传递的信息.

Solution

您可以防止默认链接操作发生,并在以后手动实现导航操作.遗憾的是,因为排队的react 状态更新是异步处理的,所以您也不能在路由状态中使用data状态.然而,您can所做的是将状态更新与具有相同值的命令性导航动作一起排队.

示例:

import { Link, useNavigate } from 'react-router-dom';

...

const navigate = useNavigate();

...

const toggledItem = (e) => {
  e.preventDefault(); // <-- prevent link navigation

  let data = {};

  switch(id) {
    case 1:
      data = softiesInfo;
      break;

    case 2:
      data = palcoInfo;
      break;

    case 3:
    default:
      data = tlaxInfo;
      break;
  }

  setData(data);
  navigate( // <-- imperative navigation
    "/DetailsPage",
    { state: { data } }
  );
};

...

<Link
  to="/DetailsPage"
  onClick={toggledItem}
  className="primary-ff boxyButton"
>
  {buttonText}
</Link>
export default function DetailsPage() {
  const location = useLocation();
  const { data } = location.state ?? {};

  return (
    <div className="header-wrap">
      <h1 className="primary-ff">{data.title}</h1>
      <img src={data.logoImg} alt={data.altLogo} />
    </div>
  )
});

Javascript相关问答推荐

React Native平面列表自动滚动

如何修复内容安全策略指令脚本-SRC自身错误?

vanillajs-datepicker未设置输入值,日期单击时未触发更改事件

将json数组项转换为js中的扁平

Bootstrap动态选项卡在切换选项卡后保持活动状态,导致元素堆叠

Chrome是否忽略WebAuthentication userVerification设置?""

未捕获错误:[]:getActivePinia()被调用,但没有活动Pinia.🍍""在调用app.use(pinia)之前,您是否try 使用store ?""

CheckBox作为Vue3中的一个组件

为什么按钮会随浮动属性一起移动?

JSDoc创建并从另一个文件导入类型

当从其他文件创建类实例时,为什么工作线程不工作?

使用RxJS from Event和@ViewChild vs KeyUp事件和RxJS主题更改输入字段值

FireBase FiRestore安全规则-嵌套对象的MapDiff

我的NavLink活动类在REACT-ROUTER-V6中出现问题

如何在Web项目中同步语音合成和文本 colored颜色 更改

有角粘桌盒阴影

使用Java脚本在div中创建新的span标记

使用VITE开发服务器处理错误

递归地将JSON对象的内容上移一级

如果未定义,如何添加全局变量