【问题标题】:React Redux how to pass data from input to rest apiReact Redux如何将数据从输入传递到rest api
【发布时间】:2019-07-01 21:24:43
【问题描述】:

我正在尝试学习 react redux,并创建了一个小型 todo 应用程序,其后端作为 REST 服务器

大部分部分都已实现,但是,我无法理解如何将输入框中的值传递给 rest API 调用。我能够成功地将输入框的值存储在 redux 状态。

我使用 react-thunk 作为中间件来处理 API 调用。

容器

import { connect } from 'react-redux'
import {toggleAddTodoDialog, addNewTodo, handleChange} from '../actions'
import AddTodoDialog from '../components/add_todo_dialog';
class AddTodoContainer extends Component {
    render() {
        return (
            <div>
                <AddTodoDialog toggleAddTodoDialog={this.props.toggleAddTodoDialog} 
                addNewTodo = {this.props.addNewTodo}
                newTodoList = {this.props.newTodoList}
                handleChange = {this.props.handleChange}
                is_add_todo_dialog_opened={this.props.is_add_todo_dialog_opened}/>
            </div>
        )
    }
}

const mapStateToProps = (state) => {
    return state
}

const bindActionsToDispatch = dispatch => 
(
  {
    toggleAddTodoDialog : (e) => dispatch(toggleAddTodoDialog(e)),
    handleChange: (e) => dispatch(handleChange(e)),
    addNewTodo : (e) => addNewTodo(e)
  }
)

export default connect(mapStateToProps, bindActionsToDispatch)(AddTodoContainer)

组件

export default class AddTodoDialog extends Component {

    toggleAddTodoDialog = (e) => {
        this.props.toggleAddTodoDialog(!this.props.is_add_todo_dialog_opened)
    }

    addNewTodo = (e) => {
        this.props.addNewTodo()
        this.toggleAddTodoDialog(e)
    }

    handleChange = (e) => {
        this.props.handleChange(e)    
    }

    render() {
        return (
            <div>
                <Button color="primary" onClick={this.toggleAddTodoDialog}>Add new Todo</Button>
                <Modal isOpen={this.props.is_add_todo_dialog_opened} >
                    {/* <Modal isOpen={false} > */}
                    <ModalHeader toggle={this.toggleAddTodoDialog}>Modal title</ModalHeader>
                    <ModalBody>
                        <FormGroup >
                            <Label for="Title">Task </Label>
                            <Input name="task"
                                value={this.props.newTodoList.task}
                                onChange={this.handleChange} />

                        </FormGroup>
                    </ModalBody>
                    <ModalFooter>
                        <Button color="primary" onClick={this.addNewTodo}>OK</Button>{' '}
                        <Button color="secondary" onClick={this.toggleAddTodoDialog}>Cancel</Button>
                    </ModalFooter>
                </Modal>

            </div>
        );
    }

行动

export function addNewTodo() {
  console.log("addNewTodo")
  return function (dispatch) {
    axios.post("http://localhost:5001/todos", 'task=' + this.props.addNewTodo.task)
      .then(response => {
        dispatch(_addTodoAction(response.data))
      })
  }
}

export function _addTodoAction(todos) {
  console.log("_addTodoAction")
  return {
    type: 'ADD_TODO',
    todos: todos
  }
}

export function handleChange(event){
  console.log("handleChange "+event)
  return{
    type: 'HANDLE_CHANGE',
    event: event
  }
}

减速器

case 'ADD_TODO':
    console.log(action)
    return {
        ...state,
        todos: action.todos
    }

【问题讨论】:

    标签: reactjs redux react-redux redux-thunk


    【解决方案1】:

    你是这样调度的:

    addNewTodo : (e) => addNewTodo(e)
    

    但您的操作不带任何参数:

    export function addNewTodo() {
      console.log("addNewTodo")
      return function (dispatch) {
        axios.post("http://localhost:5001/todos", 'task=' + this.props.addNewTodo.task)
          .then(response => {
            dispatch(_addTodoAction(response.data))
          })
      }
    }
    

    如果要输入值的值:

    handleChange = (e) => {
        this.props.handleChange(e.target.value)    
    }
    

    然后派发:

    handleChange: (value) => dispatch(handleChange(value)),
    

    然后在行动中:

    export function handleChange(value) {
    ...
    

    【讨论】:

    • 我将值传递给handleChange,我已更新为问题。但是,当我尝试访问该状态时,addNewTodo() 操作中出现错误。 TypeError: Cannot read property 'props' of undefined
    • 在您的操作中,您无权访问道具。 Props 仅适用于 React 组件,actions 是一个简单的 js 函数。所以你不能做axios.post("http://localhost:5001/todos", 'task=' + this.props.addNewTodo.task)。您需要将任务的值直接传递给函数。
    猜你喜欢
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 2022-01-11
    相关资源
    最近更新 更多