Для чого використовується аргумент ownProps у mapStateToProps і mapDispatchToProps?


95

Я бачу, що функція mapStateToPropsand, 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

Відповіді:


110

Якщо ownPropsпараметр вказаний, response-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
Примітка - Програми за замовчуванням не входять до власних Програми
Марк Сварстром

13

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

8

Відповідь goto-bus-stop хороша, але слід пам’ятати одне, що, за словами автора redux Абрамова / geearon, використання ownProps у цих функціях робить їх повільнішими, оскільки вони повинні перев’язувати творців дій, коли змінюється реквізит.

Дивіться його коментар за цим посиланням: https://github.com/reduxjs/redux-devtools/issues/250

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.