React - 无法传递来自子组件的数据
React - can't pass up data from child component
我正在将我的状态 setter 函数 (setPlayerButton) 从父组件传递给子组件。当它被调用时,我得到一个错误,它不是一个函数。我有另一个状态 setter 函数 (setGameStarted) 以完全相同的方式设置并且它可以正常工作。为什么这个会抛出错误?
父组件:
function App() {
const [gameStarted, setGameStarted] = useState<boolean>(false)
const [playerButton, setPlayerButton] = useState<string>("")
// const updatePlayerButton = (button: string) => {
// setPlayerButton(button)
// }
return (
<div>
<Header />
{gameStarted ? <PlayingGame playerButton={playerButton}/> : <Gameboard setGameStarted={setGameStarted} setPlayerButton={setPlayerButton}/>}
<Rules />
</div>
);
}
子组件(相关部分):
interface IgameBoard {
setGameStarted: React.Dispatch<React.SetStateAction<boolean>>
setPlayerButton: React.Dispatch<React.SetStateAction<string>>
}
// React.Dispatch<React.SetStateAction<string>>
function Gameboard({setGameStarted}: IgameBoard, {setPlayerButton}: IgameBoard) {
const setGame = (event: MouseEvent<HTMLElement>) => {
setGameStarted(true)
//id isn't in all variations of target and can be, for example window. If you know the target is an element, you can cast to that
setPlayerButton((event.target as Element).id)
}
return (
<div>
<section className='mx-auto w-11/12 flex flex-wrap z-10 -mb-80 mt-24 '>
{/* border-2 border-orange-300 */}
<div onClick={setGame} id='Scissors1' className='w-full mb-4'>
<div className='bg-scissors-bg-first -mb-[116px] rounded-full w-28 h-28 mx-auto' id='Scissors2'></div>
<div className='bg-scissors-bg-last -mb-24 rounded-full w-28 h-28 mx-auto' id='Scissors3'></div>
<div className='bg-slate-300 -mb-[76px] rounded-full w-20 h-20 z-10 mx-auto'id='Scissors4'></div>
<div className='bg-white rounded-full -mb-16 w-20 h-20 z-20 mx-auto' id='Scissors5'></div>
<img src={Scissors} alt='Scissors button' className='mx-auto w-9 z-30' id='Scissors6'/>
</div>
错误:
Gameboard.tsx:24 Uncaught TypeError: setPlayerButton is not a function
at setGame (Gameboard.tsx:24:1)
at HTMLUnknownElement.callCallback (react-dom.development.js:3945:1)
at Object.invokeGuardedCallbackDev (react-dom.development.js:3994:1)
at invokeGuardedCallback (react-dom.development.js:4056:1)
at invokeGuardedCallbackAndCatchFirstError (react-dom.development.js:4070:1)
at executeDispatch (react-dom.development.js:8243:1)
at processDispatchQueueItemsInOrder (react-dom.development.js:8275:1)
at processDispatchQueue (react-dom.development.js:8288:1)
at dispatchEventsForPlugins (react-dom.development.js:8299:1)
at react-dom.development.js:8508:1
这个问题在这里。您编写的代码希望传递两个单独的对象:
function Gameboard({setGameStarted}: IgameBoard, {setPlayerButton}: IgameBoard) {
但是组件 props 全部集中在一个函数参数中,而不是两个。正确的解构方式是:
function Gameboard({setGameStarted, setPlayerButton}: IgameBoard) {
我正在将我的状态 setter 函数 (setPlayerButton) 从父组件传递给子组件。当它被调用时,我得到一个错误,它不是一个函数。我有另一个状态 setter 函数 (setGameStarted) 以完全相同的方式设置并且它可以正常工作。为什么这个会抛出错误?
父组件:
function App() {
const [gameStarted, setGameStarted] = useState<boolean>(false)
const [playerButton, setPlayerButton] = useState<string>("")
// const updatePlayerButton = (button: string) => {
// setPlayerButton(button)
// }
return (
<div>
<Header />
{gameStarted ? <PlayingGame playerButton={playerButton}/> : <Gameboard setGameStarted={setGameStarted} setPlayerButton={setPlayerButton}/>}
<Rules />
</div>
);
}
子组件(相关部分):
interface IgameBoard {
setGameStarted: React.Dispatch<React.SetStateAction<boolean>>
setPlayerButton: React.Dispatch<React.SetStateAction<string>>
}
// React.Dispatch<React.SetStateAction<string>>
function Gameboard({setGameStarted}: IgameBoard, {setPlayerButton}: IgameBoard) {
const setGame = (event: MouseEvent<HTMLElement>) => {
setGameStarted(true)
//id isn't in all variations of target and can be, for example window. If you know the target is an element, you can cast to that
setPlayerButton((event.target as Element).id)
}
return (
<div>
<section className='mx-auto w-11/12 flex flex-wrap z-10 -mb-80 mt-24 '>
{/* border-2 border-orange-300 */}
<div onClick={setGame} id='Scissors1' className='w-full mb-4'>
<div className='bg-scissors-bg-first -mb-[116px] rounded-full w-28 h-28 mx-auto' id='Scissors2'></div>
<div className='bg-scissors-bg-last -mb-24 rounded-full w-28 h-28 mx-auto' id='Scissors3'></div>
<div className='bg-slate-300 -mb-[76px] rounded-full w-20 h-20 z-10 mx-auto'id='Scissors4'></div>
<div className='bg-white rounded-full -mb-16 w-20 h-20 z-20 mx-auto' id='Scissors5'></div>
<img src={Scissors} alt='Scissors button' className='mx-auto w-9 z-30' id='Scissors6'/>
</div>
错误:
Gameboard.tsx:24 Uncaught TypeError: setPlayerButton is not a function
at setGame (Gameboard.tsx:24:1)
at HTMLUnknownElement.callCallback (react-dom.development.js:3945:1)
at Object.invokeGuardedCallbackDev (react-dom.development.js:3994:1)
at invokeGuardedCallback (react-dom.development.js:4056:1)
at invokeGuardedCallbackAndCatchFirstError (react-dom.development.js:4070:1)
at executeDispatch (react-dom.development.js:8243:1)
at processDispatchQueueItemsInOrder (react-dom.development.js:8275:1)
at processDispatchQueue (react-dom.development.js:8288:1)
at dispatchEventsForPlugins (react-dom.development.js:8299:1)
at react-dom.development.js:8508:1
这个问题在这里。您编写的代码希望传递两个单独的对象:
function Gameboard({setGameStarted}: IgameBoard, {setPlayerButton}: IgameBoard) {
但是组件 props 全部集中在一个函数参数中,而不是两个。正确的解构方式是:
function Gameboard({setGameStarted, setPlayerButton}: IgameBoard) {