Что такое ' @ ' (символ at)в декораторе Redux @connect?
Я изучаю Redux с React и наткнулся на этот код. Я не уверен, что это возвращение конкретное или нет, но я видел следующий фрагмент кода в одном из примеров.
@connect((state) => {
return {
key: state.a.b
};
})
в то время как функциональность connect довольно просто, но я не понимаю @ до connect. Это даже не оператор JavaScript, если я не ошибаюсь.
может кто-нибудь объяснить, пожалуйста, что это и почему это использовали?
обновление:
Это на самом деле часть react-redux который используется для подключения компонента React к хранилищу Redux.
2 ответов:
The
@символ на самом деле является выражением JavaScript в настоящее время предлагается означить декораторы:декораторы позволяют аннотировать и модифицировать классы и свойства во время разработки.
вот пример настройки Redux без и с декоратором:
без оформителя
import React from 'react'; import * as actionCreators from './actionCreators'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; function mapStateToProps(state) { return { todos: state.todos }; } function mapDispatchToProps(dispatch) { return { actions: bindActionCreators(actionCreators, dispatch) }; } class MyApp extends React.Component { // ...define your main app here } export default connect(mapStateToProps, mapDispatchToProps)(MyApp);С помощью декоратора
import React from 'react'; import * as actionCreators from './actionCreators'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; function mapStateToProps(state) { return { todos: state.todos }; } function mapDispatchToProps(dispatch) { return { actions: bindActionCreators(actionCreators, dispatch) }; } @connect(mapStateToProps, mapDispatchToProps) export default class MyApp extends React.Component { // ...define your main app here }как приведенные выше примеры эквивалентны, это просто вопрос предпочтения. Кроме того, синтаксис декоратора еще не встроен в какие-либо среды выполнения Javascript и все еще является экспериментальным и может быть изменен. Если вы хотите использовать его, он доступен с помощью Бабель.
Очень Важно!
эти реквизиты называются реквизитами состояния, и они отличаются от обычных реквизитов, любое изменение реквизитов состояния компонента снова и снова запускает метод визуализации компонента, даже если вы не используете эти реквизиты для Производительность попробуйте привязать к вашему компоненту только те реквизиты состояния, которые вам нужны внутри вашего компонента, и если вы используете подпорки, только свяжите эти реквизиты.
пример: скажем, внутри вашего компонент вам нужно только два реквизита:
- последнее сообщение
- имя пользователя
не делай этого
@connect(state => ({ user: state.user, messages: state.messages }))этого
@connect(state => ({ user_name: state.user.name, last_message: state.messages[state.messages.length-1] }))
Comments