为啥 xState 不能与 react redux 一起使用?

Posted

技术标签:

【中文标题】为啥 xState 不能与 react redux 一起使用?【英文标题】:Why xState is not working with react redux?为什么 xState 不能与 react redux 一起使用? 【发布时间】:2020-09-24 11:29:35 【问题描述】:

我正在尝试在用户单击时更改按钮的状态,这都是 xstate 的一部分,按钮正在获取的位置,根据按钮将要工作的状态。在打字稿中,它工作正常但不是在反应钩子中

const ProjectStatus = 
  UN_ASSIGNED: 'UN_ASSIGNED',
  ASSIGNED: 'ASSIGNED',
  CHECKED_OUT: 'CHECKED_OUT',
  CHECKED_IN: 'CHECKED_IN',
  QC_START: 'QC_START',
  QC_FAIL: 'QC_FAIL',
  QC_PASS: 'QC_PASS',
  CUSTOMER_REVIEW: 'CUSTOMER_REVIEW',
  CUSTOMER_REJECT: 'CUSTOMER_REJECT',
  RE_ASSIGN: 'RE_ASSIGN',
  HOLD: 'HOLD',
  DONE: 'DONE',
  CUSTOMER_APPROVE: 'CUSTOMER_APPROVE'
;
function MachineButton() 
  const classes = useStyles();
  const dispatch = useDispatch();
  const params = useParams();
  const [anchorEl, setAnchorEl] = useState(false);
  const [current, send] = useState( ...ProjectStatus );


  const handleClick = (event) => 
    setAnchorEl(event.currentTarget);
  ;
  const handleClose = () => 
    setAnchorEl(null);
  ;

  const projectEntity = useSelector((states) => (states.taskDetails.entity));

  useEffect(() => 
    dispatch(getTaskById(params.id));
  , []);
  const toggleMachine = (currentState, action) => 
    const nextState = machine.transition(currentState, action);
    if (currentState !== nextState.value) 
      send(ProjectStatus[nextState.value]);
      dispatch(updateTask( ...projectEntity ));
    
  ;

  const getButton = (currentState) => 
    if (currentState !== undefined) 
      const nextStates = machine.states[currentState].on;
      if (Object.keys(nextStates).length !== 0) 
        return (
          <div>
            <Button
              color="primary"
              variant="contained"
              aria-controls="simple-menu"
              aria-haspopup="true"
              onClick=handleClick
            >
              Object.keys(nextStates)[0]
            </Button>
            <Menu
              id="lock-menu"
              anchorEl=anchorEl
              keepMounted
              getContentAnchorEl=null
              open=Boolean(anchorEl)
              onClose=handleClose
              anchorOrigin=
                vertical: 'bottom',
                horizontal: 'center',
              
              transformOrigin=
                vertical: 'top',
                horizontal: 'center',
              
            >
              Object.keys(nextStates).map((action, index) => (
                <MenuItem
                  key=action
                  selected=index === currentState
                  onClick=() => toggleMachine(currentState, action)
                >
                  action
                </MenuItem>
              ))
            </Menu>

          </div>


        );
      
    
  ;
  return (
    <div className=classes.actions>
      getButton(projectEntity.status)
    </div>


  );



export default MachineButton;

我得到的状态是未定义的,但是当我重新加载按钮时,值正在更新

这是我遇到的错误。

 TypeError: Cannot read property 'status' of undefined
 181 | 
  182 | 
  183 | return (
> 184 |   <div className=classes.actions>
      | ^  185 |     getButton(projectEntity.status)
  186 |   </div>
  187 | 

我有什么遗漏的,请纠正,我还需要什么

【问题讨论】:

【参考方案1】:

这可能是因为当代码到达getButton(projectEntity.status) 时,projectEntity useSelector 结果仍未计算,因此仍未定义。只需在您的装饰中添加|| 即可避免它

const projectEntity = useSelector((states) => (states.taskDetails.entity)) || 

或激活前检查器

projectEntity && getButton(projectEntity.status)

【讨论】:

以上是关于为啥 xState 不能与 react redux 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

IsValidated 在 react stepzilla 中不能与 redux 一起使用

connect redux函数不能与react-native一起使用

React Redux:为啥这个嵌套组件没有从 redux 状态接收道具?

React + Redux:为啥在第三次加载时填充道具?

react 和 Redux 的新手,为啥我会通过未定义的商店?

为啥初始状态没有保留在 react-redux 中