为什么一个函数会导致组件重新渲染,而另一个不会导致 Nextjs?
Why does one function cause component to rerender but the other does not Nextjs?
在我的 Nextjs Web 应用程序中,我的一个页面有两个函数,允许使用 nextjs 的 useState() 从数组中添加或删除电子邮件。
const [invites, setInvites] = useState([])
// other code
const lmao = () => {
console.log(invites)
}
const addEmail = async (email) => {
if(!invites.includes(email)) {
setInvites([...invites, email])
}
lmao()
}
const removeEmail = async (email) => {
let tempArray = invites
const index = tempArray.indexOf(email)
if(index > -1) {
tempArray.splice(index, 1)
}
setInvites(tempArray)
lmao()
}
函数 addEmail
成功导致组件重新呈现,并且当 运行 时,将使用添加的电子邮件明显地更新页面。但是,函数 removeEmail
无法重新呈现页面。我使用函数 lmao()
查看 invites
确实根据需要进行了更改,只是页面没有重新呈现以显示更改。
我也看过 ,但它没有回答我的问题,因为在我的例子中,传递给突变器的项目是 not ===
到它以前的值,除非我遗漏了什么。如果链接的问题确实解释了我的问题,有人可以进一步详细说明为什么 setInvites(tempArray)
即使它改变了状态值也不会导致重新渲染,以及我将如何更改我的代码来做到这一点?
我假设 tempArray 仍然是同一个数组,即同一个引用。
我会把 setInvites([...tempArray]) 而不是 setInvites(tempArray) 放在 removeEmail
tempArray 是对同一数组的另一个引用,即它是 ===
let foo = ['a', 1, 'b']
let bar = foo
bar.splice(1, 1)
console.log(foo, bar, foo===bar) // [ 'a', 'b' ] [ 'a', 'b' ] true
您可以克隆阵列:
let bar = [...foo]
或者使用某种不改变原始数组的删除:
let bar = foo.filter(f => f !== 1)
在这两种情况下你都会得到
console.log(foo, bar, foo===bar) // [ 'a', 1, 'b' ] [ 'a', 'b' ] false
在我的 Nextjs Web 应用程序中,我的一个页面有两个函数,允许使用 nextjs 的 useState() 从数组中添加或删除电子邮件。
const [invites, setInvites] = useState([])
// other code
const lmao = () => {
console.log(invites)
}
const addEmail = async (email) => {
if(!invites.includes(email)) {
setInvites([...invites, email])
}
lmao()
}
const removeEmail = async (email) => {
let tempArray = invites
const index = tempArray.indexOf(email)
if(index > -1) {
tempArray.splice(index, 1)
}
setInvites(tempArray)
lmao()
}
函数 addEmail
成功导致组件重新呈现,并且当 运行 时,将使用添加的电子邮件明显地更新页面。但是,函数 removeEmail
无法重新呈现页面。我使用函数 lmao()
查看 invites
确实根据需要进行了更改,只是页面没有重新呈现以显示更改。
我也看过 ===
到它以前的值,除非我遗漏了什么。如果链接的问题确实解释了我的问题,有人可以进一步详细说明为什么 setInvites(tempArray)
即使它改变了状态值也不会导致重新渲染,以及我将如何更改我的代码来做到这一点?
我假设 tempArray 仍然是同一个数组,即同一个引用。 我会把 setInvites([...tempArray]) 而不是 setInvites(tempArray) 放在 removeEmail
tempArray 是对同一数组的另一个引用,即它是 ===
let foo = ['a', 1, 'b']
let bar = foo
bar.splice(1, 1)
console.log(foo, bar, foo===bar) // [ 'a', 'b' ] [ 'a', 'b' ] true
您可以克隆阵列:
let bar = [...foo]
或者使用某种不改变原始数组的删除:
let bar = foo.filter(f => f !== 1)
在这两种情况下你都会得到
console.log(foo, bar, foo===bar) // [ 'a', 1, 'b' ] [ 'a', 'b' ] false