当前位置: 首页 > 知识库问答 >
问题:

React useRef不更新和呈现新值

颜高朗
2023-03-14

我是一个初学者React开发人员,我对这个特定的代码片段有一个问题。

问题:

  1. 虽然我直接复制了虚拟数据的值并将其作为单独的子项呈现,但并不是所有的虚拟数据都被呈现

我特意选择使用useRef而不是useState,因为在用户添加或编辑他们想要的任何链接之后,我想将keyRef发送到NoSQL数据库;然而,当我使用useState()时,它给了我陈旧的状态问题,其中包含所有链接的数组没有不断更新。

有什么建议吗?请和谢谢你!

代码沙盒链接:https://codesandbox.io/s/react-hooks-counter-demo-forked-0bjdy?file=/src/index.js

一个pp.js

import React, { useState, useRef } from "react";
import ReactDOM from "react-dom";
import { links } from './links';

import "./styles.css";

function App() {
  const [loaded, setLoaded] = useState(false);
  const formRef = useRef([]);
  const keyRef = useRef([]);

  if (!loaded) {
    keyRef.current = links;
    links.forEach(link => RenderLinks(link.id));
    setLoaded(true);
  }

  function RenderLinks(id) {
    const formLength = formRef.current.length;

    if (id === null)
    formRef.current = [ ...formRef.current, <AddLink key={formLength} id={formLength} /> ];

    if (id && !formRef.current.find(form => form.props.id === id))
    formRef.current = [ ...formRef.current, <AddLink key={formLength} id={formLength} /> ];
  }

  function AddLink(props) {
    const id = props.id;
    const value = keyRef.current[id] ? keyRef.current[id].link : '';
    const [input, setInput] = useState(value);
    keyRef.current = [
      ...keyRef.current,
      {
        id: id,
        link: '',
      }
    ];
    return <input onChange={e => setInput(e.target.value)} value={input} />
  }

  return (
    <div>
      <button onClick={() => RenderLinks(null)}>add</button>
      {formRef.current ? formRef.current.map(child => child) : null}
    </div>
  )
}

links.js又名虚拟数据

export const links = [
  {
    id: 0,
    link: "www.zero.com"
  },
  {
    id: 1,
    link: "www.one.com"
  },
  {
    id: 2,
    link: "www.two.com"
  },
  {
    id: 3,
    link: "www.three.com"
  },
  {
    id: 4,
    link: "www.four.com"
  },
  {
    id: 5,
    link: "www.five.com"
  },
  {
    id: 6,
    link: "www.six.com"
  },
  {
    id: 7,
    link: "www.seven.com"
  }
];

共有3个答案

曹君墨
2023-03-14

您必须同时使用useStateuseRef

useRef用于保存最新值,而useState用于更新状态。

例子:

const showARef = useRef("inline");
const showBRef = useRef("inline");

 const [showA, setshowA] = useState(showARef.current);
 const [showB, setshowB] = useState(showBRef.current);
水瀚漠
2023-03-14

您可以使用状态变量重新呈现所有状态组件,我已经尝试并成功地实现了一个简单的方法:

const [, forceUpdate] = useReducer((x) => x + 1, 0)

添加链接后,可以调用forceUpdate(),它将起到useState()的作用。

笪烨
2023-03-14

从React useRef()文档:

请记住,useRef不会在内容更改时通知您。改变当前属性不会导致重新渲染

因此,即使它正在更新,您也永远不会得到显示已添加的第7、第8等链接的重新渲染。

我认为您最好使用useState()hook链接并呈现这些链接。也许一个单独的问题可以确定你所看到的陈旧问题。

 类似资料:
  • 我试图学习libGDX游戏开发的一些简单原则,并在下面的代码中获得了吸吮。我已经将更新和渲染的任务分开,但不太确定如何将它们放在一起。我所要做的就是绘制一个在屏幕上移动的简单矩形。我的代码如下所示。除了渲染,一切都正常。 使用的呈现方法:

  • 我不知道为什么这不起作用 单击该按钮显然会更改道具,但旧的仍在输入中!那么什么给了?我做错了什么?这是虫子吗?有变通办法吗?

  • 我猜这可能与从父级打开有关,但我有其他组件,它们内部的状态发生变化,所以我有点困惑,为什么这个组件不尊重它的新状态。 谢谢

  • 问题内容: 我正在使用react-router寻找一种更新页面URL /哈希的方法,而无需路由器重新渲染整个页面。 我正在开发一个全页轮播,并且希望每个幻灯片都有其自己的URL(允许用户刷新页面并返回正确的幻灯片)。转盘稍后将进行类似于此演示的滑动,这意味着 下 一张幻灯片已预渲染。 我的旋转木马的精简版在这里提供。 当前的幻灯片更改如下所示: 这可以正常工作,没有URL更新。我真正想要的是: 这

  • 这里我遇到了的小问题。我知道这是一个异步函数。我也使用了SO示例中的一些示例,我在中获得了我的值,但这个值在状态中没有更新。 我需要在这里更改什么来获得更新的值。请给我任何建议。 这里在我的代码选项卡更改值应该更新为提交。 //代码