使用打字稿在 React router v6 中将状态作为道具传递

Passing state as a prop in React router v6 with typescript

请原谅我的无知,因为我是 React router v6 和 Typescript 的新手。 我正在尝试传递一个状态和一个函数,它们将改变我的应用程序数据流中的状态。

const [playerSystem, setPlayerSystem] = useState<String>("Cheese")
      <UImaster />
    
      <Routes>
        <Route path="/sectora" element={<SectorView  {...playerSystem} /> } />
</Routes>

然而,当我这样做时,如果我将 playerSystemsetPlayerSystem 都放入元素的道具中,它会抛出错误。 目前我的 SectorView 组件正在抛出这个难以置信的不清楚的错误。

Type '{ toString(): string; charAt(pos: number): string; charCodeAt(index: number): number; concat(...strings: string[]): string; indexOf(searchString: string, position?: number | undefined): number; ... 44 more ...; Symbol.iterator: IterableIterator<...>; }' has no properties in common with type 'IntrinsicAttributes'.


如何将状态和状态更改功能传递给其他组件?

<SectorView />组件中是否定义了Props类型?

playerSystem 是一个字符串,所以你不能通过传播它作为道具传递。错误消息是在一个字符串上列出所有属性并抱怨它们不匹配 IntrinsicAttributes,这是一种令人困惑的方式来引用您可以作为道具传递给 HTML 元素的事物集.

这就是您将这些值作为道具传递的方式:

<SectorView playerSystem={playerSystem} setPlayerSystem={setPlayerSystem} />

一般来说,传播确实适用于字符串,但对于 props,我相信只有对象会起作用,因为 props 是一组键和值。因此,例如,这等同于上面的内容:

const [playerSystem, setPlayerSystem] = useState<String>("Cheese")
const props = { playerSystem, setPlayerSystem }

<SectorView {...props} />

请注意,对于 { playerSystem: playerSystem, setPlayerSystem: setPlayerSystem }{ playerSystem, setPlayerSystem }shorthand

我猜想当您尝试包含 setPlayerSystem 时它根本不起作用的原因是您正在做 {...setPlayerSystem} 并且您永远无法传播函数。使用 playerSystem 它可以让你进行传播,因为字符串允许这样做,但是 SectorView 不知道如何处理它,这就是错误来自那里的原因。

这里是传播如何(独立于 JSX)对象、字符串和数组的例子。

const obj1 = { a: 1 }
const obj2 = { b: 2 }

console.log({ ...obj1, ...obj2 }) // { a: 1, b: 2 }

const arr1 = [1, 2, 3]
const arr2 = [4, 5, 6]

console.log([...arr1, ...arr2]) // [1, 2, 3, 4, 5, 6]

const str1 = "ab"
const str2 = "cd"

console.log([ ...str1, ...str2]) // ["a", "b", "c", "d"]