更新数组 useState 反应挂钩(Next.js)
updating array useState react hooks (Next.js)
我正在尝试更新我的 'state' 数组并使用 'setState' 将字符串类型的项目插入其中,但它不起作用。
我知道它不适用于 push()。
我还尝试使用扩展运算符更新我的 'state' 数组,但它也不起作用。
这是我的代码:
import React, { useState } from 'react';
import _, { debounce } from 'lodash';
export default function Search() {
const [state, setState] = useState([])
const handleChange = debounce(async (value) => {
const url = `http://localhost:3100/`
if (value == '') {
return
}
let response = await fetch(url, {
headers: {
'Content-Type': 'application/json'
},
method: 'POST',
body: JSON.stringify({ value })
})
let test = await response.json()
console.log(test)
setState(state.concat(test))
// setState([...state, test]) it also doesn't work
console.log(state)
}, 1000)
return (
<>
<div>
<input onChange={e => handleChange(e.target.value)} />
</div>
</>
)
}
'state' 数组保持为空。我需要明白为什么。
1.) 将 if(value == '')
更改为 if(value ==='')
2.) console.log(state)
在你的 setState 之后将 return 之前的状态值,因为组件还没有刷新。查看此处的示例:https://codesandbox.io/s/friendly-ives-vvo13?file=/src/App.js:103-474 并键入内容并查看控制台。然后键入其他内容并查看控制台。您将看到控制台显示您之前输入的状态。但是,如果您查看 return 内呈现的 {state},它将显示当前状态。
export default function App() {
const [state, setState] = useState([]);
const handleChange = debounce(async value => {
let test = ["cars", "boat", "bike"];
setState([...test, value]);
console.log(state);
}, 1000);
return (
<>
<div>
{state}
<input onChange={e => handleChange(e.target.value)} />
</div>
</>
);
}
所以你在设置状态,只是 accessing/reading 它放错了地方。
https://codesandbox.io/s/next-js-infinite-scroll-3vfem?file=/pages/Content.js
我从上面的演示中向这个函数添加了一行
const getMorePost = async () => {
const res = await fetch(
`https://jsonplaceholder.typicode.com/todos?_start=${posts.length}&_limit=20`
);
const newPosts = await res.json()
setHasMore(!!newPosts.length)
setPosts((post) => [...post, ...newPosts])
}
现在滚动完成正常。
我正在尝试更新我的 'state' 数组并使用 'setState' 将字符串类型的项目插入其中,但它不起作用。
我知道它不适用于 push()。
我还尝试使用扩展运算符更新我的 'state' 数组,但它也不起作用。
这是我的代码:
import React, { useState } from 'react';
import _, { debounce } from 'lodash';
export default function Search() {
const [state, setState] = useState([])
const handleChange = debounce(async (value) => {
const url = `http://localhost:3100/`
if (value == '') {
return
}
let response = await fetch(url, {
headers: {
'Content-Type': 'application/json'
},
method: 'POST',
body: JSON.stringify({ value })
})
let test = await response.json()
console.log(test)
setState(state.concat(test))
// setState([...state, test]) it also doesn't work
console.log(state)
}, 1000)
return (
<>
<div>
<input onChange={e => handleChange(e.target.value)} />
</div>
</>
)
}
'state' 数组保持为空。我需要明白为什么。
1.) 将 if(value == '')
更改为 if(value ==='')
2.) console.log(state)
在你的 setState 之后将 return 之前的状态值,因为组件还没有刷新。查看此处的示例:https://codesandbox.io/s/friendly-ives-vvo13?file=/src/App.js:103-474 并键入内容并查看控制台。然后键入其他内容并查看控制台。您将看到控制台显示您之前输入的状态。但是,如果您查看 return 内呈现的 {state},它将显示当前状态。
export default function App() {
const [state, setState] = useState([]);
const handleChange = debounce(async value => {
let test = ["cars", "boat", "bike"];
setState([...test, value]);
console.log(state);
}, 1000);
return (
<>
<div>
{state}
<input onChange={e => handleChange(e.target.value)} />
</div>
</>
);
}
所以你在设置状态,只是 accessing/reading 它放错了地方。
https://codesandbox.io/s/next-js-infinite-scroll-3vfem?file=/pages/Content.js
我从上面的演示中向这个函数添加了一行
const getMorePost = async () => {
const res = await fetch(
`https://jsonplaceholder.typicode.com/todos?_start=${posts.length}&_limit=20`
);
const newPosts = await res.json()
setHasMore(!!newPosts.length)
setPosts((post) => [...post, ...newPosts])
}
现在滚动完成正常。