MapStateToProps ve mapDispatchToProps içindeki ownProps argümanının kullanımı nedir?


97

Bunu görmek mapStateToPropsve mapDispatchToPropsgeçirilen fonksiyon connectRedux fonksiyonu almak ownPropsikinci bir argüman olarak.

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

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

İsteğe bağlı [ownprops]argüman ne için?

Redux belgelerinde zaten bir tane olduğu için işleri netleştirmek için ek bir örnek arıyorum.


Daha açık konuşabilir misin; Bağlandığınız dokümantasyondaki bu argümanın açıklamaları hakkında net olmayan nedir?
jonrsharpe

Argümanın kullanıldığı ek bir pratik örnek arıyordum.
therewillbecode

1
O halde bunu netleştirmek için soruyu düzenleyebilir misiniz ?
jonrsharpe

1
@jonrsharpe React-redux dokümanları ne olduğunu söylemez, sadece var olduğunu, ownProps olarak adlandırılır ve fonksiyonun ne olduğunu değil, geçip geçmeyeceğini belirler.
deb0ch

@ deb0ch 18 ay önce ne dediğini bilmiyorum ama şu anda "aksesuarlar bağlı bileşene geçti" diyor . Her iki durumda da OP soruyu düzenledi ve bir yanıt aldı ve kabul etti.
jonrsharpe

Yanıtlar:


112

Eğer ownPropsparametre belirtilirse, tepki-redux senin içine bileşen geçirildi sahne geçecek connectfonksiyonları. Öyleyse, bunun gibi bağlı bir bileşen kullanırsanız:

import ConnectedComponent from './containers/ConnectedComponent'

<ConnectedComponent
  value="example"
/>

ownPropsİçerideki mapStateToPropsve mapDispatchToPropsfonksiyonları bir nesne olacak:

{ value: 'example' }

Ve bu işlevlerden ne döndürüleceğine karar vermek için bu nesneyi kullanabilirsiniz.


Örneğin, bir blog yazısı bileşeninde:

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

Söz konusu gönderiye bir şeyler yapan Redux eylem yaratıcılarını iade edebilirsiniz:

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

Şimdi bu bileşeni şu şekilde kullanırsınız:

import BlogPostContainer from './BlogPostContainer.js'

<BlogPostContainer id={1} />

11
Not - defaultProps, ownProps'a dahil değildir
Mark Swardstrom

14

ownProps, ebeveyn tarafından aktarılan eşyalar anlamına gelir.

Yani mesela:

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'un cevabı güzel, ancak hatırlanması gereken bir şey, redux yazarı Abramov / gaearon'a göre, bu işlevlerde ownProps kullanmak onları yavaşlatıyor çünkü sahne değiştiğinde aksiyon yaratıcılarını yeniden canlandırmaları gerekiyor.

Bu bağlantıdaki yorumuna bakın: https://github.com/reduxjs/redux-devtools/issues/250

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.