Tôi có thể mapDispatchToProps mà không có mapStateToProps trong Redux không?


92

Tôi đang phá vỡ ví dụ todo của Redux để cố gắng hiểu nó. Tôi đọc rằng mapDispatchToPropscho phép bạn lập bản đồ các hành động điều phối làm đạo cụ, vì vậy tôi đã nghĩ đến việc viết lại addTodo.jsđể sử dụng mapDispatchToProps thay vì gọi công văn (addTodo ()). Tôi đã gọi nó addingTodo(). Một cái gì đó như thế này:

import React from 'react';
import {connect} from 'react-redux';
import addTodo from '../actions';

let AddTodo = ({addingTodo}) => {
  let input;
  return (
      <div>
        <form onSubmit={e => {
          e.preventDefault()
          if (!input.value.trim()) {
            return
          }
          addingTodo(input.value)
          input.value = ""
        }}>
          <input ref={node => {
            input = node
          }} />
          <button type="submit">Submit</button>
        </form>
      </div>
  )
}

const mapDispatchToProps = {
  addingTodo: addTodo
}

AddTodo = connect(
  mapDispatchToProps
)(AddTodo)

export default AddTodo

Tuy nhiên, khi tôi chạy ứng dụng, tôi nhận được lỗi này: Error: Invalid value of type object for mapStateToProps argument when connecting component AddTodo.. Tôi chưa từng mapStateToPropsbắt đầu với thành phần AddTodo, vì vậy tôi không chắc chắn điều gì đã xảy ra. Cảm giác ruột của tôi nói rằng điều đó connect()mong đợi sẽ mapStateToPropsxảy ra trước đó mapDispatchToProps.

Bản gốc đang hoạt động trông như thế này:

import React from 'react';
import {connect} from 'react-redux';
import addTodo from '../actions';

let AddTodo = ({dispatch}) => {
  let input;
  return (
      <div>
        <form onSubmit={e => {
          e.preventDefault()
          if (!input.value.trim()) {
            return
          }
          dispatch(addTodo(input.value))
          input.value = ""
        }}>
          <input ref={node => {
            input = node
          }} />
          <button type="submit">Submit</button>
        </form>
      </div>
  )
}

AddTodo = connect()(AddTodo)

export default AddTodo

Hoàn thành repo có thể được tìm thấy ở đây .

Vì vậy, câu hỏi của tôi là, có thể thực hiện mapDispatchToProps mà không cần mapStateToProps không? Điều tôi đang cố gắng thực hiện có phải là một thực hành được chấp nhận - nếu không, tại sao không?

Câu trả lời:


144

Có, bạn có thể. Chỉ cần chuyển nulllàm đối số đầu tiên:

AddTodo = connect(
    null,
    mapDispatchToProps
)(AddTodo)

Vâng, đó không chỉ là cách thực hành được chấp nhận mà còn là cách được khuyến nghị để kích hoạt các hành động. Sử dụng mapDispatchToPropscho phép ẩn sự thật về việc sử dụng redux bên trong các thành phần phản ứng của bạn


6
Nhưng tôi có thể sử dụng mapStateToProps mà không có mapDispatchToProps theo cách tương tự không?
Velizar Andreev Kitanov

6
@VelizarAndreevKitanov vâng
iofjuupasli

22
Khi chỉ sử dụng mapStateToProps, người ta có thể bỏ qua đối số thứ hai connect. Đó không phải là cần thiết để vượt quanull
theUtherSide

1
Đối với trường hợp ngược mapStateToProps mà không có mapDispatchToProps thì không cần chuyển null. chỉ vượt qua bản đồStateToProps
Rajesh Nasit

2
connectlẽ ra phải chấp nhận một đối tượng theo nghĩa đen như một tham số thay vì danh sách các đối số.
Mahdi Pedram
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.