как перейти с useState на useReducer

#reactjs #use-reducer

#reactjs #use-reducer

Вопрос:

Следующий код, который я пытаюсь преобразовать в useReducer, но несколько вещей, которые я не могу понять. В следующем коде handleClick обновляет состояние и вызывает другие функции для дальнейших действий. В useReducer я могу обновить состояние, но как вызвать другие функции.

  const handleClick = (id) =>{
    let matchedEl = userArray.find(el => el.pic == picArray[id].pic)
    if(matchedEl){
        alert('game over')`
        setUserArray([]);
        gameOver();
    } else {
        let picObj = { "pic": picArray[id].pic}
        setUserArray([...userArray, picObj]) //updates the state
        if(userArray.length == 12){
            setUserArray([])
            scoreFn();
            return;
        }
        let shuffledArray = shufflePicArray();
        setPicArray([...shuffledArray]) //updates the state
        scoreFn();
    }   
}

return (
        <Container >
                        <Card onClick={() => handleClick(id)} /> </Card>
            </Row>             
        </Container>)}
  
  

С помощью useReducer

 const initialState = {
    picArray: pics,
    userArray: []
}
function reducer(state, action){
    switch(action.type){
        case "handleClick" :
        {
            let id = action.payload;
            const shuffledArray = state.picArray.sort( () => Math.random() - 0.5)
            let matchedEl = state.userArray.find(el => el.pic == state.picArray[id].pic)
            console.log(matchedEl)
            let picObj;
            if(!matchedEl){
                    picObj = { "pic": state.picArray[id].pic}
                } else {
                    alert('game over')
                    gameOver(); //can't call the function is not defined yet
                }
        return{
            state,
           picArray:[...shuffledArray], //this works
           userArray:[...state.userArray, picObj] //this works
        }
    }
    default:
      return state;
    }
}

const Newmain = ({scoreFn, gameOver}) => {
    const [state, dispatch] = useReducer(reducer, initialState)

return(
<card onClick={() =>dispatch({type:'handleClick', payload:id})} />
)}```


The useState handleClick function does a lot more things and how to reproduce while using useReducer. 
  

Ответ №1:

чтобы ответить на ваш вопрос, вы можете добавить

 const handleClick = (id) => {
//do stuff here
dispatch({type:'handleClick', payload:id})
}  


и тогда <card onClick={() => handleClick(id)} /> , как это было, но я бы рекомендовал использовать useCallback в зависимости от вашего варианта использования