Почему бы не отправлять прямо в магазин из Action Creator Redux? - PullRequest
0 голосов
/ 21 сентября 2018

Я создаю приложение с использованием избыточности и реактивного натива.

Мне любопытно, какой шаблон я использую.У меня не было никаких недостатков, однако я не видел этого ни в одном учебном пособии, что заставляет меня задуматься, почему никто этого не делает.

Вместо того, чтобы передавать создателей действий в качестве реквизита в функции соединения, например

 connect(mapStateToProps,{ func1, func2 })(Component);

Я импортировал магазин приложений внутри модуля, где я вначале объявляю функции:

import { AppStore } from '../App';
const actionCreator = () => {
   doSomethng();
   appStore.dispatch({ type: 'Action' });
};

Для меня это облегчает выполнение асинхронных действий, потому что мне не нужно промежуточное ПО:

import { AppStore } from '../App';
const actionCreator = async () => {
   await doSomethng();
   appStore.dispatch({ type: 'Action' });
};

Я сделал это из-за ошибки js-lint 'no-shadow'.Это заставило меня понять, что для того, чтобы использовать его, мне пришлось импортировать создателей действий в файл компонента, а затем передать его как опору в функцию соединения, чтобы у создателя действий был доступ к диспетчеризации.

import { actionCreator1, actionCreator2 } from './actionCreators';

const myComponent = (props) => {
   const { actionCreator1, actionCreator2 } = props; //shadowed names
   return (
      <Button onPress={actionCreator1} />
   );
};

export default connect({}, { actionCreator1, actionCreator2 })(myComponent)

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

import { actionCreator1, actionCreator2 } from './actionCreators';

const myComponent = (props) => {
   return (
      <Button onPress={actionCreator1} />
   );
};

export default connect({})(myComponent)

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Так почему бы не напрямую вызвать создатель действия внутри компонента, как вы это делаете, а не передать его в функцию connect(), как это делают все остальные?

Redux не обнаруживает автоматически при каждом вызовесоздатель действия.

Redux не обнаруживает автоматически функцию, возвращающую объект, являющийся действием.

Мой actions/index.js файл содержит создателя моего действия.Вы и я называем эту функцию создателем действия, но, объективно говоря, это просто функция.Это все, что видит Redux.Redux не знает, что эта конкретная функция является действием.

Поэтому, когда вы входите в свой компонент и импортируете создателя действия, вот так: import { selectSong } from ‘../actions’;

Объективно говоря, мы не импортируемсоздатель действия в компонент, технически мы просто импортируем функцию.

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

Возвращаемый объект не будет перенаправлен на приставку.Если мы когда-нибудь хотим убедиться, что действие попадает в редуктор, мы должны передать его этой диспетчерской функции.

Вот более прямой пример:

const store = createStore(ourDepartments);

store.dispatch(createPolicy('Alejandra', 35));

store.dispatch(createPolicy('Ben', 20));
store.dispatch(createPolicy('Daniel', 78));

store.dispatch(createClaim('Alejandra', 120));
store.dispatch(createClaim('Ben', 50));

store.dispatch(deletePolicy('Daniel'));

console.log(store.getState());

Обратите внимание, каккаждый раз, когда я отправляю действие, я вызываю создателя действия, который возвращал объект действия, который непосредственно передается в функцию store.dispatch().

Если я не передал результаты этих создателей действия в отправкуно вместо этого вызывается просто:

createPolicy('Alejandra', 35), 
createClaim('Alejandra', 120), 
deletePolicy(‘Alejandra’) 

. Это никогда не обновит хранилище с избыточностью, оно вернет действие, но оно никогда не отправлялось в избыточность, и они никогда не оказывались внутри редуктора.

Чтобы убедиться, что создатель действия действительно обновляет наше состояние, мы должны выполнить возвращаемое действие и передать его нашей функции диспетчеризации.

Теперь, конечно, нет ссылки на функцию диспетчеризации внутринаш компонент.Так что же происходит?

Когда мы передаем нашего создателя действий в функцию connect(), функция connect() выполняет специальную операцию над функциями внутри объекта действий

export default connect(mapStateToProps, { selectSong })(SongList);

Функция connect() по сути превращает действие в новую функцию JavaScript.Когда мы вызываем новую функцию JavaScript, функция connect() автоматически вызывает нашего создателя действия, выполняет возвращаемое действие и автоматически вызывает для нас функцию dispatch().

Таким образом, передавая действиесоздатель в функцию connect(), всякий раз, когда мы вызываем создателя действия, который добавляется к нашему объекту props, функция автоматически выполняет возвращаемое действие и бросает его в функцию отправки для нас.

Итак, все, что происходит за кулисами, и вам не нужно задумываться об этом, когда вы используете функцию connect().

Так вот почему инженерпередать нашего создателя действия функции connect(), а не просто вызывать его изнутри компонента.

Поэтому, когда вы хотите вызвать создателя действия из компонента, вы всегда будете передавать его в этот компонент.Функция соединения, а не просто произвольно вызывать ее внутри компонента.

Надеюсь, это имеет смысл.

0 голосов
/ 21 сентября 2018

Мне нравится, что вы пытаетесь найти свои собственные решения ваших конкретных проблем.Это признак инженера, просто в этом случае это не решение.

Я думаю, идея о том, как Redux учит вас делать вещи, не предназначена для канонизации.У вас есть возможность разместить диспетчер на ваших объектах, потому что он позволяет вещам быть прозрачными, что означает, что вещи связаны за пределами вашего класса и внедрены. Вы скрыли свою зависимость от хранилища, напрямую ссылаясь на нее в некоторых других файлах.Уже не так очевидно, как ваше приложение работает в отношении рабочего процесса.Другой разработчик реакции может быть сбит с толку, я полагаю, это главный недостаток.

Если вы согласны с этими аспектами, то все в порядке.Хорошо, как в, он выполняет свою работу, но не «отлично» в том смысле, что он охватывает такие понятия, как Принцип единой ответственности

...