Jakie jest zastosowanie argumentu ownProps w mapStateToProps i mapDispatchToProps?

97

Widzę, że funkcja mapStateToPropsand, mapDispatchToPropsktóra jest przekazywana do connectfunkcji w Redux, przyjmuje ownPropsjako drugi argument.

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

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

Jaki jest opcjonalny [ownprops]argument?

Szukam dodatkowego przykładu, aby wyjaśnić sprawę, ponieważ taki istnieje już w dokumentacji Redux

to się stanie
źródło
Możesz być bardziej dokładny; co jest niejasne w wyjaśnieniach tego argumentu w dokumentacji, do której odsyłasz?
jonrsharpe
Szukałem tylko dodatkowego praktycznego przykładu, w którym argument został użyty.
Stanie się
1
Czy mógłbyś wtedy zmienić pytanie, aby było jasne?
jonrsharpe
1
@jonrsharpe Dokumenty react-redux nie mówią, co to jest, tylko że istnieje, nazywa się ownProps i że charakterystyka funkcji określa, czy jest przekazywana - a nie czym jest.
deb0ch
@ deb0ch Nie wiem, co było napisane 18 miesięcy temu, ale teraz jest napisane „rekwizyty przekazane do połączonego komponentu” . Tak czy inaczej, od tego czasu PO zredagował pytanie oraz otrzymał i zaakceptował odpowiedź.
jonrsharpe

Odpowiedzi:

112

Jeśli ownPropsparametr jest określony, react-redux przekaże właściwości przekazane do komponentu do twoich connectfunkcji. Jeśli więc używasz takiego podłączonego komponentu:

import ConnectedComponent from './containers/ConnectedComponent'

<ConnectedComponent
  value="example"
/>

ownPropsWewnątrz swoimi mapStateToPropsand mapDispatchToPropsfunkcji będzie przedmiotem:

{ value: 'example' }

I możesz użyć tego obiektu, aby zdecydować, co zwrócić z tych funkcji.


Na przykład w składniku wpisu na blogu:

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

Możesz zwrócić twórców akcji Redux, którzy zrobią coś z tym konkretnym postem:

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

Teraz możesz użyć tego komponentu w następujący sposób:

import BlogPostContainer from './BlogPostContainer.js'

<BlogPostContainer id={1} />
goto-bus-stop
źródło
11
Uwaga - defaultProps nie jest uwzględniony w ownProps
Mark Swardstrom
14

ownProps odnosi się do właściwości przekazanych przez rodzica.

Na przykład:

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
  };
};
Bar Horing
źródło
9

Odpowiedź goto-bus-stop jest dobra, ale jedną rzecz do zapamiętania jest to, że według autora redux, Abramova / gaearona, użycie ownProps w tych funkcjach powoduje ich spowolnienie, ponieważ muszą ponownie powiązać twórców akcji, gdy zmieniają się rekwizyty.

Zobacz jego komentarz w tym linku: https://github.com/reduxjs/redux-devtools/issues/250

Steven Anderson
źródło