Việc sử dụng đối số ownProps trong mapStateToProps và mapDispatchToProps là gì?


95

Tôi thấy rằng mapStateToPropsmapDispatchToPropschức năng mà được truyền cho các connectchức năng trong Redux mất ownPropsnhư một đối số thứ hai.

[mapStateToProps(state, [ownProps]): stateProps] (Function):

[mapDispatchToProps(dispatch, [ownProps]): dispatchProps] (Object or Function):

[ownprops]Đối số tùy chọn để làm gì?

Tôi đang tìm kiếm một ví dụ bổ sung để làm rõ ràng mọi thứ vì đã có một ví dụ trong tài liệu Redux


Bạn có thể đặc sắc hơn không; điều gì không rõ ràng về các giải thích của lập luận đó trong tài liệu bạn liên kết đến?
jonrsharpe

Tôi chỉ đang tìm kiếm một ví dụ thực tế bổ sung mà đối số được sử dụng.
there willbecode

1
Sau đó, bạn có thể chỉnh sửa câu hỏi để làm cho điều đó rõ ràng?
jonrsharpe

1
@jonrsharpe Các tài liệu react-redux không cho biết nó là gì, chỉ là nó tồn tại, được gọi là ownProps và độ hiếm của hàm xác định xem nó có được truyền hay không - chứ không phải nó là gì.
deb0ch

@ deb0ch Tôi không biết nó nói gì 18 tháng trước, nhưng ngay bây giờ nó nói "đạo cụ được chuyển cho thành phần được kết nối" . Dù bằng cách nào, OP đã chỉnh sửa câu hỏi và nhận được và chấp nhận một câu trả lời.
jonrsharpe

Câu trả lời:


110

Nếu ownPropstham số được chỉ định, react-redux sẽ chuyển các đạo cụ đã được chuyển cho thành phần vào các connecthàm của bạn . Vì vậy, nếu bạn sử dụng một thành phần được kết nối như thế này:

import ConnectedComponent from './containers/ConnectedComponent'

<ConnectedComponent
  value="example"
/>

Bên ownPropstrong của bạn mapStateToPropsvà các mapDispatchToPropshàm sẽ là một đối tượng:

{ value: 'example' }

Và bạn có thể sử dụng đối tượng này để quyết định những gì sẽ trả về từ các hàm đó.


Ví dụ: trên một thành phần bài đăng trên blog:

// BlogPost.js
export default function BlogPost (props) {
  return <div>
    <h2>{props.title}</h2>
    <p>{props.content}</p>
    <button onClick={props.editBlogPost}>Edit</button>
  </div>
}

Bạn có thể trả lại những người tạo hành động Redux làm điều gì đó cho bài đăng cụ thể đó:

// BlogPostContainer.js
import { bindActionCreators } from 'redux'
import { connect } from 'react-redux'
import BlogPost from './BlogPost.js'
import * as actions from './actions.js'

const mapStateToProps = (state, props) =>
  // Get blog post data from the store for this blog post ID.
  getBlogPostData(state, props.id)

const mapDispatchToProps = (dispatch, props) => bindActionCreators({
  // Pass the blog post ID to the action creator automatically, so
  // the wrapped blog post component can simply call `props.editBlogPost()`:
  editBlogPost: () => actions.editBlogPost(props.id)
}, dispatch)

const BlogPostContainer = connect(mapStateToProps, mapDispatchToProps)(BlogPost)
export default BlogPostContainer

Bây giờ bạn sẽ sử dụng thành phần này như sau:

import BlogPostContainer from './BlogPostContainer.js'

<BlogPostContainer id={1} />

11
Lưu ý - defaultProps không được bao gồm trong ownProps
Mark Swardstrom 14/1117

13

ownProps đề cập đến các đạo cụ được cha mẹ truyền lại.

Ví dụ:

Parent.jsx:

...
<Child prop1={someValue} />
...

Child.jsx:

class Child extends Component {
  props: {
    prop1: string,
    prop2: string,
  };
...
}

const mapStateToProps = (state, ownProps) => {
  const prop1 = ownProps.prop1;
  const tmp = state.apiData[prop1]; // some process on the value of prop1
  return {
    prop2: tmp
  };
};

8

Câu trả lời của goto-bus-stop là tốt, nhưng một điều cần nhớ là, theo tác giả của redux, Abramov / gaearon, việc sử dụng ownProps trong các chức năng đó khiến chúng chậm hơn vì chúng phải gắn kết những người tạo hành động khi đạo cụ thay đổi.

Xem bình luận của anh ấy trong liên kết này: https://github.com/reduxjs/redux-devtools/issues/250

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.