【发布时间】:2021-07-18 07:57:26
【问题描述】:
App.tsx
import React from 'react';
import Visualizer from './components/Visualizer/Visualizer';
import ArrayProvider from './contexts/arrayProvider';
function App() {
return (
<ArrayProvider>
<Visualizer />
</ArrayProvider>
);
}
export default App;
Visualizer.tsx
import React, { useEffect } from 'react'
import MenuBar from '../MenuBar/MenuBar'
import { useArray } from '../../contexts/arrayProvider'
import './Visualizer.min.css'
import { resetArray } from '../../utils/helpers'
function Visualizer() {
const { array, setArray } = useArray()
useEffect(() => {
console.log("Visualizer mounted!")
setArray(resetArray(array))
}, [])
return (
<div className="visualizer">
<MenuBar />
{array.map((num, idx) => <div key={idx}>{idx}: {num} </div>)}
</div>
)
}
export default Visualizer;
arrayProvider.tsx
import React, { useContext, createContext, useState, Dispatch, SetStateAction } from "react";
import { ARRAY_LENGTH, generateArray } from "../utils/helpers";
export interface IFC_ProviderProps {
children?: any
}
type ArrayContextData = number[]
type ArrayContextValue = {
array: ArrayContextData;
setArray: Dispatch<SetStateAction<ArrayContextData>>;
}
export const ArrayContext = createContext<ArrayContextValue | undefined>(undefined)
const ArrayProvider = (props: IFC_ProviderProps) => {
const [array, setArray] = useState(generateArray(ARRAY_LENGTH))
return (
<ArrayContext.Provider value={{ array, setArray }}>
{props.children}
</ArrayContext.Provider>
)
}
export const useArray = () => {
const ctxValue = useContext(ArrayContext)
if (ctxValue === undefined) throw new Error(
"Expected an AppProvider somewhere in the react tree to set context value")
return ctxValue // now has type AppContextValue
// or even provide domain methods for better encapsulation
}
export default ArrayProvider
MenuBar.tsx
import React from 'react'
import { useArray } from '../../contexts/arrayProvider'
import { resetArray } from '../../utils/helpers'
import './MenuBar.min.css'
export default function MenuBar() {
const { array, setArray } = useArray()
console.log("Rendering Menubar")
const generateNewArray = () => {
console.log("Generating...")
setArray(resetArray(array))
}
return (
<div className="menu-bar">
<button
className="generate-new-array-btn"
onClick={generateNewArray}
>Generate New Array</button>
</div>
)
}
我正在尝试创建一个排序可视化工具。我正在使用上下文 API 将数组提供给多个组件。菜单栏中的生成新数组按钮使数组随机化。
问题是当我点击 generate-array 按钮时,它会随机化数组,但 setArray 方法不会更新状态。
任何帮助将不胜感激。 提前致谢。
【问题讨论】:
-
所以你是说
setArray(resetArray(array))实际上并没有更新状态?你能分享这个resetArray实用程序吗?
标签: javascript reactjs typescript react-context