账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    react入门TODO List的reducer代码疑惑
    30
    0

    问题描述

    TODO List案例,删除list的action数据改变后没有重新渲染UI

    问题出现的环境背景及自己尝试过哪些方法

    redux-devtools-extension插件,检查action触发后的数据变化,发现一切正常.

    相关代码

    reducer

    const defaultState = {
      inputValue: 'somethings',
      list:[]
    }
    
    export default (state=defaultState, action) => {  
      const newState = Object.assign({}, state)
      switch (action.type) {
        case 'change_input_value':
          newState.inputValue = action.value
          return newState
        case 'submit_input_value':
          if (newState.inputValue !== ''){
            newState.list.push(newState.inputValue)
            newState.inputValue = ''
          }
          return newState
        case 'delete':      
          newState.list.splice(action.index, 1)      
          return newState
    
        default:
          break;
      }
    
      return newState
    }

    todoList.js

    import React, {Fragment } from 'react'
    import {connect} from 'react-redux'
    
    
    const TodoList = (props) => {
      const {list, inputValue, handleClick, handleDelete, handleInputChange} = props
        return (
          <Fragment>
            <input onChange={handleInputChange} value={inputValue}></input>
            <button onClick={handleClick}>提交</button>
            <ul>
              {
                list.map((item, index) => {
                  return <li key={index} onClick={() => {handleDelete(index)}}>{item}</li>
                })
              }
            </ul>
          </Fragment>
        )
    }
    
    const mapStateToProps = (state) => {
      return {
        inputValue: state.inputValue,
        list: state.list
      }
    }
    
    const mapDispatchToProps = (dispatch) => {
      return {
        handleInputChange(e) {
          const value = e.target.value
          const action = {
            type: 'change_input_value',
            value
          }
          dispatch(action)
        },
        handleClick(){
          const action = {
            type: 'submit_input_value'
          }
          dispatch(action)
        }, 
        handleDelete(index){      
          const action = {
            type: 'delete',
            index
          }
          dispatch(action)
        }
      }
    }
    
    export default connect(mapStateToProps, mapDispatchToProps)(TodoList)

    你期待的结果是什么?实际看到的错误信息又是什么?

    没有错误,只是点击新增加的list item后,数据state变化了,而页面UI没变化.

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 喵粉物语●′ω● 普通会员 1楼

      在React中,一个Todo List组件可以通过Redux库来管理。Redux是一个库,它提供了一种机制,使你能够以一种中心化的、自动化的、可追踪的方式管理你的应用程序。

      以下是一个简单的Todo List组件的ReactRedux reducer代码示例:

      ```javascript import { createStore, applyMiddleware } from 'redux'; import thunk from 'redux-thunk'; import todoReducer from './todoReducer';

      const store = createStore(todoReducer, applyMiddleware(thunk));

      export default store; ```

      在这个例子中,我们首先导入了reduxredux-thunk库,然后我们创建了一个新的Redux store。然后,我们使用createStore函数创建了一个Redux store,并在其中添加了一个名为todoReducer的 reducer。

      todoReducer是一个 reducer函数,它会接收一个输入state,然后根据这个输入更新state。在这个例子中,state是一个对象,其中包含了当前的Todo List的状态。

      以下是一个todoReducer函数的示例:

      ```javascript const todos = [];

      function reducer(state = todos, action) { switch (action.type) { case 'ADD_TODO': return { ...state, todos: [...state.todos, action.payload] }; case 'DELETE_TODO': return { ...state, todos: state.todos.filter(todo => todo.id !== action.payload.id) }; case '完成_TODO': return { ...state, todos: state.todos.filter(todo => todo.id === action.payload.id) }; default: return state; } } ```

      在这个例子中,我们定义了一个todos数组来存储所有的Todo List的状态。然后,我们定义了一个reducer函数,它接收一个state和一个action作为输入。这个函数根据action的类型来决定如何更新state。例如,如果action是一个ADD_TODO,那么我们就将action.payload添加到statetodos数组中。如果action是一个DELETE_TODO,那么我们就从statetodos数组中删除action.payload的Todo。如果action是一个完成_TODO,那么我们就从statetodos数组中删除action.payload的Todo。

      最后,我们使用applyMiddleware函数将redux-thunk库添加到我们的store中。redux-thunk库可以用来处理异步操作,例如添加新的Todo List。

      这就是一个简单的Todo List组件的ReactRedux reducer代码示例。你可以根据自己的需要来修改这个 reducer,例如添加更多的输入和输出,或者改变如何处理异步操作。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部