Qual è l'uso dell'argomento ownProps in mapStateToProps e mapDispatchToProps?


95

Vedo che la funzione mapStateToPropse mapDispatchToPropspassata alla connectfunzione in Redux prende ownPropscome secondo argomento.

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

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

A cosa serve l' [ownprops]argomento opzionale ?

Sto cercando un ulteriore esempio per chiarire le cose in quanto ce n'è già uno nei documenti di Redux


Potresti essere più specifico; cosa non è chiaro riguardo alle spiegazioni di tale argomento nella documentazione a cui ti colleghi?
jonrsharpe

Stavo solo cercando un ulteriore esempio pratico in cui è stato utilizzato l'argomento.
diventerà il

1
Quindi potresti modificare la domanda per renderlo più chiaro?
jonrsharpe

1
@jonrsharpe I documenti di react-redux non dicono cosa sia, solo che esiste, si chiama ownProps e che l'arità della funzione determina se è passata - non quello che è.
deb0ch il

@ deb0ch Non so cosa abbia detto 18 mesi fa, ma in questo momento dice "gli oggetti di scena sono passati al componente collegato" . In ogni caso, da allora il PO ha modificato la domanda e ha ricevuto e accettato una risposta.
jonrsharpe

Risposte:


110

Se il ownPropsparametro è specificato, react-redux passerà gli oggetti di scena che sono stati passati al componente nelle tue connectfunzioni. Quindi, se utilizzi un componente connesso come questo:

import ConnectedComponent from './containers/ConnectedComponent'

<ConnectedComponent
  value="example"
/>

L' ownPropsinterno delle tue funzioni mapStateToPropse mapDispatchToPropssarà un oggetto:

{ value: 'example' }

E potresti usare questo oggetto per decidere cosa restituire da quelle funzioni.


Ad esempio, su un componente di un post del 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>
}

Potresti restituire i creatori di azioni Redux che fanno qualcosa per quel post specifico:

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

Ora useresti questo componente in questo modo:

import BlogPostContainer from './BlogPostContainer.js'

<BlogPostContainer id={1} />

11
Nota: defaultProps non è incluso in ownProps
Mark Swardstrom

13

ownProps si riferisce agli oggetti di scena che sono stati tramandati dal genitore.

Quindi, ad esempio:

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

La risposta di goto-bus-stop è buona, ma una cosa da ricordare è che, secondo l'autore di redux, Abramov / gaearon, l'uso di ownProps in quelle funzioni le rende più lente perché devono ricollegare i creatori di azioni quando gli oggetti di scena cambiano.

Vedi il suo commento in questo link: https://github.com/reduxjs/redux-devtools/issues/250

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.