Ввод состояния пользователя-обучающего

#reactjs #typescript #types #use-reducer

#реагирует на #машинописный текст #типы #использование-редуктор

Вопрос:

В настоящее время я работаю над калькулятором в react с машинописным текстом, но у меня возникли некоторые проблемы с вводом состояния в моей функции редуктора. Пока работает только «любой». Я знаю, что это объект со строками внутри, но я не знаю, почему это не работает.

Спасибо за вашу помощь.

 import { useReducer } from "react"; import Grid from "./components/Grid"; import NumberButton from "./components/NumberButton"; import OperatorButton from "./components/OperatorButton";  // type State = { // currentOperation?: string // result?: string // operator?: string // }  export enum ACTIONS {  ADD_NUMBER = 'add-number',  ADD_OPERATOR = 'add-operator',  CALCULATE = 'calculate',  DELETE = 'delete',  RESET = 'reset' }  export type Action = {  type: ACTIONS,  payload?: { digit?: string, operator?: string } }  const reducer = (state: any, { type, payload }: Action) =gt; {   console.log("State", state);   switch (type) {  case ACTIONS.ADD_NUMBER:  return {  ...state,  currentOperation: `${state.currentOperation || ""}${payload!.digit}`  };     default:  break;  } };  const App = () =gt; {   const [{ currentOperation, result, operator }, dispatch] = useReducer(reducer, {});   return (  lt;Gridgt;  lt;div className="displayScreen"gt;  lt;div className="currentOperation"gt;{currentOperation} {operator}lt;/divgt;  lt;div className="result"gt;{result}lt;/divgt;  lt;/divgt;  lt;button onClick={() =gt; dispatch({ type: ACTIONS.RESET })}gt;Clt;/buttongt;  lt;/Gridgt;  ) }  export default App;   

Ответ №1:

Ваше заявление о переключении не является исчерпывающим. В случае по умолчанию вы ничего не возвращаете.

измените функцию редуктора следующим образом:

 const reducer = (state: State, { type, payload }: Action) =gt; {  

и затем:

 default:   return state;  

Это должно сработать.

Еще один способ ввода действий без перечислений:

 type State = {  currentOperation?: string  result?: string  operator?: string } export type Action =   | { type: 'ADD_NUMBER', payload: {digit: number} }  | { type: 'ADD_OPERATOR', payload: string};  const reducer = (state: State, action: Action) =gt; {  console.log("State", state);  switch (action.type) {  case 'ADD_NUMBER':  return {  ...state,  currentOperation: `${state.currentOperation || ""}${action.payload.digit}`  };  case 'ADD_OPERATOR':  return {  ...state,  // (payload here is a string)  }    default:  return state;  } };  

Комментарии:

1. Большое вам спасибо, я пропустил ответную часть

2. @Sam если это работает для вас, пожалуйста, не забудьте принять этот ответ