Я хотел бы передать действие, как показано ниже, компоненту в качестве реквизита, но при этом получаю ошибку.
Это, кажется, работает нормально:
import React, { useState, useEffect, useContext } from 'react';
import MyScheduleDispatch from './MyScheduleContext'
export default function generateShowItem({action}) {
const dispatch = useContext(MyScheduleDispatch);
const [isIconSolid, setIsIconSolid] = useState(false)
function handleIconOnClick() {
setIsIconSolid(!isIconSolid)
}
useEffect(() =>
{
if(isIconSolid) dispatch({ type: action, payload: item })
},
[isIconSolid]
)
const emptyIcon = <StarIconBorder onClick={handleIconOnClick} className={classes.star}></StarIconBorder>
const solidIcon = <StarIconSolid onClick={handleIconOnClick} className={classes.star}></StarIconSolid>
return (
<div style={{position: 'relative'}} key={index}>
{isIconSolid ? solidIcon : emptyIcon }
</div>
)
}
Но когда я пытаюсь пропустить действие (которое жестко закодировано выше как "addItem"
, оно выдает ошибку
useEffect(() =>
{
if(isIconSolid) dispatch({ type: props.action, payload: item })
},
[isIconSolid]
)
Ошибка:
Schedule.js:30 Uncaught Error
at myScheduleReducer (Schedule.js:30)
at updateReducer (react-dom.development.js:13247)
at Object.useReducer (react-dom.development.js:13828)
at useReducer (react.development.js:1467)
at Schedule (Schedule.js:34)
at renderWithHooks (react-dom.development.js:12939)
at updateFunctionComponent (react-dom.development.js:14628)
at beginWork (react-dom.development.js:15638)
at performUnitOfWork (react-dom.development.js:19313)
at workLoop (react-dom.development.js:19353)
at renderRoot (react-dom.development.js:19436)
at performWorkOnRoot (react-dom.development.js:20343)
at performWork (react-dom.development.js:20255)
at performSyncWork (react-dom.development.js:20229)
at requestWork (react-dom.development.js:20098)
at commitPassiveEffects (react-dom.development.js:18796)
at wrapped (scheduler-tracing.development.js:207)
at flushFirstCallback (scheduler.development.js:107)
at flushWork (scheduler.development.js:219)
at MessagePort../node_modules/scheduler/cjs/scheduler.development.js.channel.port1.onmessage (scheduler.development.js:611)
Примечание: я знаю, что Redux похож на это и использует "connect" для сопоставления диспетчеризации с реквизитами, возможно, это связано с чем-то подобным ... (просто мысль)
https://react -redux.js.org / с использованием реагирующими-перевождь / подключения-mapdispatch