【发布时间】:2021-03-27 23:15:33
【问题描述】:
我是新手,所以如果这是一个非常基本的问题,我深表歉意。我无法在任何地方找到答案。
我有一个ExtensionsContext 组件,它将扩展类对象的数组存储为状态。
import React, { useContext, useState } from 'react'
const ExtensionsContext = React.createContext()
export function useExtensions() {
return useContext(ExtensionsContext)
}
export function ExtensionsProvider ({ children }) {
const [exts, setExtensions] = useState(startingExtensions) // startingExtentions is an array of Extention class objects
AppExtensions = {
extensions: exts,
update: function () { setExtensions(this.extensions) }
}
return (
<ExtensionsContext.Provider value={AppExtensions}>
{children}
</ExtensionsContext.Provider>
)
}
class Extension {
constructor (name, index) {
this.name = name
this.isOpen = false
this.id = index
}
open () {
this.isOpen = true
AppExtensions.update()
}
close () {
this.isOpen = false
AppExtensions.update()
}
}
这些扩展在一个组件中使用,该组件在打开和关闭之间列出和分组它们。目前,如果我在其中一个扩展上调用 open 方法,它将更改扩展值,但不会重新渲染任何组件。我目前已对其进行设置,以便当单击按钮时,它会在组件中的 true 和 1 之间切换布尔状态以强制重新渲染,但我知道我做错了什么并且有更好的解决方案。如果我在多个地方使用这些扩展,这也不起作用。我想问题与我传入AppExtensions 对象和exts 的副本而不是直接传入exts 的事实有关。我希望能够通过单击调用extension.open()并处理ExtensionsProvider 中的所有逻辑。
【问题讨论】:
标签: reactjs react-hooks use-context