Jpa*_*061 18 javascript reactjs react-hooks
我是一名初学者 React 开发人员,我对这个特定的代码片段有疑问。
问题:
我特意选择使用 useRef 而不是 useState,因为在用户添加或编辑他们想要的任何链接后,我想将 keyRef 发送到 NoSQL 数据库;而当我使用 useState() 时,它给了我陈旧的状态问题,其中包含所有链接的数组没有不断更新。
有什么建议么?谢谢,麻烦您了!
CodeSandbox链接:https://codesandbox.io/s/react-hooks-counter-demo-forked-0bjdy?file=/src/index.js
应用程序.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>
)
}
Run Code Online (Sandbox Code Playgroud)
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"
}
];
Run Code Online (Sandbox Code Playgroud)
Ant*_*ony 17
\n\n\n请记住,useRef 在其内容更改时不会\xe2\x80\x99 通知您。改变 .current 属性不会导致重新渲染
\n
因此,即使它正在更新,您也永远不会重新渲染显示已添加的第 7 个、第 8 个等链接。
\n我认为你最好使用useState()
钩子来链接并渲染它们。也许一个单独的问题可以识别您所看到的陈旧问题。
小智 8
您可以使用状态变量来重新渲染所有状态组件,我尝试过并成功做到的一个简单的方法是:
const [, forceUpdate] = useReducer((x) => x + 1, 0)
Run Code Online (Sandbox Code Playgroud)
添加链接后,您可以调用forceUpdate(),它将充当useState()
您必须同时使用useState
和useRef
。
useRef
用于保留最新值并useState
更新状态。
例子 :
const showARef = useRef("inline");
const showBRef = useRef("inline");
const [showA, setshowA] = useState(showARef.current);
const [showB, setshowB] = useState(showBRef.current);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
36275 次 |
最近记录: |