gpt4 book ai didi

javascript - 组件本地状态未使用 React 自定义 Hook 更新

转载 作者:行者123 更新时间:2023-11-30 19:41:02 25 4
gpt4 key购买 nike

我刚开始使用 React Hooks,在使用自定义 Hooks 时遇到了一些问题。这可能是缺乏理解,但这就是我正在尝试的

我的自定义 Hook :

import React, { useState } from "react"

export const useValidateContent = initState => {
const[valid, setValid] = useState(initState)
const[errorMsg, setErrorMsg] = useState(null)

const validate = () => {
// Update component state to test
setValid(false)
setErrorMsg('Some error found')
}

return [valid, validate, errorMsg]

}

我使用自定义 Hook 的父容器:

import React, { useState, useEffect } from 'react'
import { useValidateContent } from './hooks/useValidateContent'


export default function ParentComp () {

const [contentIsValid, validate, contentError] = useValidateContent(true)

const initValidate = () => {
// values before running validate
console.log('valid', contentIsValid)
console.log('error', contentError)
validate()
// values after running validate
console.log('valid', contentIsValid)
console.log('error', contentError)
}

return (
<div>
<button onclick={initValidate} />
</div>
)
}

我希望在这里得到安慰的是:

valid true
error null
valid false
error Some error found

相反,我看到的是:

valid true
error null
valid true
error null

似乎钩子(Hook)没有更新本地状态。为什么是这样?即使当我尝试在 hook 组件中控制这些值时,我也会得到同样的结果。我不明白这是为什么。我使用自定义钩子(Hook)错了吗?

最佳答案

使用钩子(Hook)更新状态是异步的,就像类组件中的 setState 一样,并且由于状态未发生变化,contentIsValidcontentError 将仍然指的是陈旧的旧状态而不是新状态。

如果您呈现状态变量,您将看到您的代码按预期工作。

const { useState } = React;

const useValidateContent = initState => {
const [valid, setValid] = useState(initState);
const [errorMsg, setErrorMsg] = useState("");

const validate = () => {
setValid(false);
setErrorMsg("Some error found");
};

return [valid, validate, errorMsg];
};

function ParentComp() {
const [contentIsValid, validate, contentError] = useValidateContent(true);

const initValidate = () => {
// values before running validate
console.log("valid", contentIsValid);
console.log("error", contentError);
validate();
// values after running validate
console.log("valid", contentIsValid);
console.log("error", contentError);
};

return (
<div>
<button onClick={initValidate}>initValidate</button>
contentIsValid: {contentIsValid.toString()}, contentError: {contentError}
</div>
);
}

ReactDOM.render(<ParentComp />, document.getElementById("root"));
<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

<div id="root"></div>

关于javascript - 组件本地状态未使用 React 自定义 Hook 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55405327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com