【发布时间】:2020-01-06 23:25:38
【问题描述】:
我正在尝试使用Context API 从class component 移植到react hooks,但我无法弄清楚收到错误的具体原因。
首先,我的代码:
// contexts/sample.jsx
import React, { createContext, useState, useContext } from 'react'
const SampleCtx = createContext()
const SampleProvider = (props) => {
const [ value, setValue ] = useState('Default Value')
const sampleContext = { value, setValue }
return (
<SampleCtx.Provider value={sampleContext}>
{props.children}
</SampleCtx.Provider>
)
}
const useSample = (WrappedComponent) => {
const sampleCtx = useContext(SampleCtx)
return (
<SampleProvider>
<WrappedComponent
value={sampleCtx.value}
setValue={sampleCtx.setValue} />
</SampleProvider>
)
}
export {
useSample
}
// Sends.jsx
import React, { Component, useState, useEffect } from 'react'
import { useSample } from '../contexts/sample.jsx'
const Sends = (props) => {
const [input, setInput ] = useState('')
const handleChange = (e) => {
setInput(e.target.value)
}
const handleSubmit = (e) => {
e.preventDefault()
props.setValue(input)
}
useEffect(() => {
setInput(props.value)
}, props.value)
return (
<form onSubmit={handleSubmit}>
<input value={input} onChange={handleChange} />
<button type="submit">Submit</button>
</form>
)
}
我得到的错误:
Invariant Violation:无效的钩子调用。钩子只能在函数组件的主体内部调用。这可能是由于以下原因之一: 1. 你可能有不匹配的 React 版本和渲染器(例如 React DOM) 2. 你可能违反了 Hooks 规则 3. 你可能有多个 React 副本相同的应用程序 请参阅https://reactjs.org/warnings/invalid-hook-call-warning.html 以获取有关如何调试和修复此问题的提示。
我的代码说明:
我使用Context API 来管理状态,之前我使用class components 来制作视图。我希望结构简单明了,不需要更多细节。
我认为它应该也可以工作,<Sends /> 组件被传递到 useSample HoC 函数中,并被 sample.jsx 的 <SampleProvider> 组件包裹,因此 <Sends /> 可以使用 props由SampleCtx 上下文提供。但结果是失败。
HoC 模式与React hooks 一起使用是否无效?还是通过props将突变函数(即useState()制作的setValue)交给其他组件无效?或者,使用hooks 将2 个或更多function components 放在一个文件中是否无效?请指正具体是什么原因。
【问题讨论】:
-
@JosephD。我修正了错字,这是一个微不足道的错字。我没有使用
<Consumer />,因为我想改用useContext。即使我使用了useContext钩子,我是否必须使用<Consumer />? -
不。
useContext()和<Consumer />是等价的。
标签: javascript reactjs react-hooks react-context