Wozu dient das Argument ownProps in mapStateToProps und mapDispatchToProps?


93

Ich sehe, dass die mapStateToPropsund mapDispatchToPropsFunktion, die connectin Redux an die Funktion übergeben werden, ownPropsals zweites Argument dienen.

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

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

Wofür ist das optionale [ownprops]Argument?

Ich suche nach einem zusätzlichen Beispiel, um die Dinge klarer zu machen, da es bereits eines in den Redux-Dokumenten gibt


Könnten Sie genauer sein; Was ist unklar über die Erklärungen dieses Arguments in der Dokumentation, auf die Sie verlinken?
— Jonrsharpe

Ich habe nur nach einem zusätzlichen praktischen Beispiel gesucht, in dem das Argument verwendet wurde.
— Es wird

1
Könnten Sie dann die Frage bearbeiten , um dies zu verdeutlichen?
— Jonrsharpe

1
@jonrsharpe Die React-Redux-Dokumente sagen nicht, was es ist, nur dass es existiert, heißt ownProps und dass die Arität der Funktion bestimmt, ob es übergeben wird - nicht was es ist.
— Deb0ch

@ deb0ch Ich weiß nicht, was es vor 18 Monaten gesagt hat, aber im Moment heißt es "die Requisiten wurden an die verbundene Komponente übergeben" . In beiden Fällen hat das OP die Frage inzwischen bearbeitet und eine Antwort erhalten und akzeptiert.
— Jonrsharpe

Antworten:


108

Wenn der ownPropsParameter angegeben ist, übergibt react-redux die Requisiten, die an die Komponente übergeben wurden, an Ihre connectFunktionen. Wenn Sie also eine verbundene Komponente wie diese verwenden:

import ConnectedComponent from './containers/ConnectedComponent'

<ConnectedComponent
  value="example"
/>

Das ownPropsInnere Ihres mapStateToPropsund mapDispatchToPropsFunktionen wird ein Objekt sein:

{ value: 'example' }

Mit diesem Objekt können Sie entscheiden, was von diesen Funktionen zurückgegeben werden soll.


Zum Beispiel in einer Blogpost-Komponente:

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

Sie können Redux-Aktionsersteller zurückgeben, die etwas mit diesem bestimmten Beitrag tun:

// 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

Jetzt würden Sie diese Komponente folgendermaßen verwenden:

import BlogPostContainer from './BlogPostContainer.js'

<BlogPostContainer id={1} />

11
Hinweis - defaultProps ist nicht in ownProps enthalten
— Mark Swardstrom

13

ownProps bezieht sich auf die Requisiten, die vom Elternteil weitergegeben wurden.

Also zum Beispiel:

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

Die Antwort von goto-bus-stop ist gut, aber eine Sache, an die man sich erinnern sollte, ist, dass laut dem Autor von Redux, Abramov / Gaearon, die Verwendung von ownProps in diesen Funktionen sie langsamer macht, weil sie die Aktionsersteller neu binden müssen, wenn sich die Requisiten ändern.

Siehe seinen Kommentar in diesem Link: https://github.com/reduxjs/redux-devtools/issues/250

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.