Какая польза от аргумента ownProps в mapStateToProps и mapDispatchToProps?


97

Я вижу , что mapStateToPropsи mapDispatchToPropsфункции , которые передаются connectфункции в Redux взять в ownPropsкачестве второго аргумента.

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

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

Для чего нужен необязательный [ownprops]аргумент?

Я ищу дополнительный пример, чтобы прояснить ситуацию, поскольку он уже есть в документации Redux


Не могли бы Вы уточнить; что неясно в объяснениях этого аргумента в документации, на которую вы ссылаетесь?
jonrsharpe

Я просто искал дополнительный практический пример, в котором использовался аргумент.
код

1
Тогда не могли бы вы отредактировать вопрос, чтобы прояснить это?
jonrsharpe

1
@jonrsharpe В документации response-redux не говорится, что это такое, просто то, что он существует, называется ownProps и что арность функции определяет, передана ли она, а не то, что она есть.
deb0ch

@ deb0ch Я не знаю, что было сказано 18 месяцев назад, но сейчас там написано, что «свойства переданы подключенному компоненту» . В любом случае ОП отредактировал вопрос, получил и принял ответ.
jonrsharpe

Ответы:


112

Если ownPropsпараметр указан, react-redux передаст реквизиты, которые были переданы компоненту, в ваши connectфункции. Итак, если вы используете такой подключенный компонент:

import ConnectedComponent from './containers/ConnectedComponent'

<ConnectedComponent
  value="example"
/>

ownPropsВнутри ваших mapStateToPropsи mapDispatchToPropsфункций будет объект:

{ value: 'example' }

И вы можете использовать этот объект, чтобы решить, что возвращать из этих функций.


Например, в компоненте сообщения в блоге:

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

Вы можете вернуть создателей действий Redux, которые что-то делают в этом конкретном посте:

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

Теперь вы можете использовать этот компонент так:

import BlogPostContainer from './BlogPostContainer.js'

<BlogPostContainer id={1} />

11
Примечание - defaultProps не включен в ownProps
Марк Свардстрем,

14

ownProps относится к реквизитам, переданным родительским элементом.

Так, например:

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
  };
};

9

Ответ goto-bus-stop хорош, но нужно помнить одну вещь: по словам автора redux, Abramov / gaearon, использование ownProps в этих функциях делает их медленнее, потому что они должны повторно связывать создателей действий при изменении свойств.

См. Его комментарий по этой ссылке: https://github.com/reduxjs/redux-devtools/issues/250

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.