createStore()
. Чтобы объединить несколько редукторов вместе, Redux предоставляет метод combineReducers()
. Этот метод принимает объект как аргумент, в котором вы определяете свойства, которые связывают ключи с конкретными функциями редуктора. Имя, которое вы передаете клавишам, будет использоваться Redux как имя связанного участка состояния. Как правило, хорошей практикой является создание редуктора для каждой части состояния приложения, когда они являются определенными или уникальными в некотором роде. Например, в приложении для заметок с аутентификацией пользователя один редуктор может обрабатывать аутентификацию, а другой - текст и заметки, которые пользователь отправляет. Для такого приложения мы можем написать метод combineReducers()
следующим образом: const rootReducer = Redux.combineReducers ({Теперь ключевые
auth: authenticationReducer,
примечания: примечанияReducer
});
notes
будут содержать все состояние, связанное с нашими заметками и обрабатываемое нашими notesReducer
. Так можно создать несколько редукторов для управления более сложным состоянием приложения. В этом примере состояние, хранящееся в хранилище Redux, будет тогда единственным объектом, содержащим свойства auth
и notes
. createStore()
. Чтобы объединить несколько редукторов вместе, в Redux есть метод combineReducers()
. Этот метод принимает объект как аргумент, в котором вы определяете свойства, которые связывают ключи с конкретными функциями редуктора. Имя, которое вы задаёте ключам, будет использоваться Redux как имя для связанной части состояния. Как правило, хорошей практикой является создание редуктора для каждой части состояния приложения, когда они являются особенными или уникальными в некотором роде. Например, в приложении для заметок с аутентификацией пользователя один редуктор может обрабатывать аутентификацию, а другой - текст и заметки, которые пользователь отправляет. Для такого приложения мы можем написать метод combineReducers()
следующим образом: const rootReducer = Redux.combineReducers ({Теперь ключ
auth: authenticationReducer,
notes: notesReducer
});
notes
будет содержать все состояние, связанное с нашими заметками и обрабатываемое нашим notesReducer
. Так можно создать несколько редукторов для управления более сложным состоянием приложения. В этом примере состояние, находящееся в хранилище Redux, будет тогда единственным объектом, содержащим свойства auth
и notes
. counterReducer()
имеются функции counterReducer()
и authReducer()
, а также хранилище Redux. Завершите запись функции rootReducer()
с помощью Redux.combineReducers()
. Назначьте counterReducer
ключу с именем count
и authReducer
на ключ с именем auth
. counterReducer()
и authReducer()
, а также хранилище Redux. Завершите написание функции rootReducer()
, используя Redux.combineReducers()
. Назначьте counterReducer
ключу с именем count
и authReducer
- ключу с именем auth
. counterReducer
должен увеличивать и counterReducer
state
.
+ - text: counterReducer
должен увеличивать и уменьшать state
.
testString: 'assert((function() { const initalState = store.getState().count; store.dispatch({type: INCREMENT}); store.dispatch({type: INCREMENT}); const firstState = store.getState().count; store.dispatch({type: DECREMENT}); const secondState = store.getState().count; return firstState === initalState + 2 && secondState === firstState - 1 })(), "The counterReducer
should increment and decrement the state
.");'
- text: authReducer
должен переключать state
authenticated
между true
и false
.
testString: 'assert((function() { store.dispatch({type: LOGIN}); const loggedIn = store.getState().auth.authenticated; store.dispatch({type: LOGOUT}); const loggedOut = store.getState().auth.authenticated; return loggedIn === true && loggedOut === false })(), "The authReducer
should toggle the state
of authenticated
between true
and false
.");'
- - text: 'Магазин state
должно иметь два ключа: count
, который содержит номер и auth
, который содержит объект. Объект auth
должен иметь свойство authenticated
, которое содержит логическое значение.'
+ - text: 'Хранилище state
должно иметь два ключа: count
, который содержит число и auth
, который содержит объект. Объект auth
должен иметь свойство authenticated
, которое содержит логическое значение.'
testString: 'assert((function() { const state = store.getState(); return typeof state.auth === "object" && typeof state.auth.authenticated === "boolean" && typeof state.count === "number" })(), "The store state
should have two keys: count
, which holds a number, and auth
, which holds an object. The auth
object should have a property of authenticated
, which holds a boolean.");'
- text: 'rootReducer
должен быть функцией, которая объединяет counterReducer
и authReducer
.'
testString: 'getUserInput => assert((function() { const noWhiteSpace = getUserInput("index").replace(/\s/g,""); return typeof rootReducer === "function" && noWhiteSpace.includes("Redux.combineReducers") })(), "The rootReducer
should be a function that combines the counterReducer
and the authReducer
.");'
@@ -69,7 +69,7 @@ const authReducer = (state = {authenticated: false}, action) => {
}
};
-const rootReducer = // define the root reducer here
+const rootReducer = // определите здесь корневой редуктор
const store = Redux.createStore(rootReducer);
diff --git a/curriculum/challenges/russian/03-front-end-libraries/redux/register-a-store-listener.russian.md b/curriculum/challenges/russian/03-front-end-libraries/redux/register-a-store-listener.russian.md
index 924db9cce5..2558f27dd5 100644
--- a/curriculum/challenges/russian/03-front-end-libraries/redux/register-a-store-listener.russian.md
+++ b/curriculum/challenges/russian/03-front-end-libraries/redux/register-a-store-listener.russian.md
@@ -4,14 +4,14 @@ title: Register a Store Listener
challengeType: 6
isRequired: false
videoUrl: ''
-localeTitle: Зарегистрировать слушателя магазина
+localeTitle: Регистрация слушателя хранилища
---
## Description
-store.subscribe()
вас есть доступ к объекту store
Redux, - store.subscribe()
. Это позволяет вам подписывать функции слушателя в хранилище, которые вызывается всякий раз, когда действие отправляется против магазина. Одним из простых способов использования этого метода является подписка функции на ваш магазин, которая просто регистрирует сообщение каждый раз, когда принимается действие, и хранилище обновляется. store
, - это store.subscribe()
. Он позволяет вам подписать функции слушателя к хранилищу, которые будут вызываться всякий раз, когда действие отправляется в хранилище. Одним из простых способов использования этого метода является подписка функции на ваше хранилище, которая просто регистрирует сообщение каждый раз, когда принимается действие, и хранилище обновляется. count
каждый раз , когда магазин принимает действие, и передать эту функцию в к store.subscribe()
метода. Вы увидите, что store.dispatch()
вызывается три раза подряд, каждый раз непосредственно передавая объект действия. Посмотрите вывод консоли между диспетчерами действий, чтобы увидеть обновления. count
каждый раз, когда хранилище принимает действие, и передать эту функцию в метод store.subscribe()
. Вы увидите, что store.dispatch()
вызывается три раза подряд, каждый раз непосредственно передавая объект действия. Посмотрите вывод консоли между отправками действия, чтобы увидеть, что обновления происходят. ADD
в хранилище должна увеличивать состояние на 1
.
testString: 'assert((function() { const initialState = store.getState(); store.dispatch({ type: "ADD" }); const newState = store.getState(); return newState === (initialState + 1); })(), "Dispatching the ADD
action on the store should increment the state by 1
.");'
- - text: 'Должна быть функция прослушивателя, подписанная на магазин, используя store.subscribe
.'
+ - text: 'Должна быть функция слушателя, подписанная на хранилище, используя store.subscribe
.'
testString: 'getUserInput => assert(getUserInput("index").includes("store.subscribe("), "There should be a listener function subscribed to the store using store.subscribe
.");'
- - text: Обратный вызов store.subscribe
также должен увеличивать глобальную переменную count
при обновлении хранилища.
+ - text: Обратный вызов в store.subscribe
также должен увеличивать значение глобальной переменной count
при обновлении хранилища.
testString: 'assert(store.getState() === count, "The callback to store.subscribe
should also increment the global count
variable as the store is updated.");'
-
```
authenticated
свойством. Вам также нужны создатели действий, которые создают действия, соответствующие логину пользователя и пользователю, а также сами объекты действий. authenticated
. Вам также нужны создатели действий, которые создают действия, отвечающие за вход пользователя и за выход пользователя из системы, а также сами объекты действий. reducer
для обработки нескольких действий аутентификации. Используйте оператор switch
JavaScript в reducer
чтобы реагировать на различные события действий. Это стандартный образец при записи редукторов Redux. Оператор switch должен переключать action.type
и возвращать соответствующее состояние аутентификации. Примечание. На этом этапе не беспокойтесь о неизменности состояния, поскольку в этом примере оно мало и просто. Для каждого действия вы можете вернуть новый объект - например {authenticated: true}
. Кроме того, не забудьте написать случай по default
в вашем операторе switch, который возвращает текущее state
. Это важно, потому что, как только ваше приложение имеет несколько редукторов, все они запускаются в любое время, когда происходит отправка действий, даже если действие не связано с этим редуктором. В таком случае вы хотите убедиться, что вы вернете текущее state
. reducer
для обработки различных действий аутентификации. Используйте JavaScript оператор switch
в reducer
чтобы реагировать на различные события действий. Это стандартный паттерн при описание редукторов Redux. Оператор switch должен переключаться между action.type
и возвращать соответствующее состояние аутентификации. Примечание. На этом этапе не беспокойтесь о неизменности состояния, поскольку это маленький и простой пример. Для каждого действия вы можете вернуть новый объект - например, {authenticated: true}
. Кроме того, не забудьте написать случай по умолчанию default
в вашем операторе switch, который возвращает текущее state
. Это важно, потому что когда в вашем приложении несколько редукторов, все они запускаются, когда происходит отправка действий, даже если действие не связано с этим редуктором. В таком случае вы хотите убедиться, что вы вернете текущее state
. loginUser
должен вернуть объект с свойством type, установленным в строку LOGIN
.'
+ - text: 'Вызов функции loginUser
должен вернуть объект со свойством type, установленным в строковое значение LOGIN
.'
testString: 'assert(loginUser().type === "LOGIN", "Calling the function loginUser
should return an object with type property set to the string LOGIN
.");'
- - text: 'Вызов функции logoutUser
должен вернуть объект с свойством типа, установленным в строку LOGOUT
.'
+ - text: 'Вызов функции logoutUser
должен вернуть объект со свойством type, установленным в строковое значение LOGOUT
.'
testString: 'assert(logoutUser().type === "LOGOUT", "Calling the function logoutUser
should return an object with type property set to the string LOGOUT
.");'
- - text: 'Магазин должен быть инициализирован объектом с authenticated
свойством, установленным на false
.'
+ - text: 'Хранилище должно быть инициализировано объектом со свойством authenticated
, установленным в false
.'
testString: 'assert(store.getState().authenticated === false, "The store should be initialized with an object with an authenticated
property set to false
.");'
- - text: Dispatching loginUser
должен обновить authenticated
свойство в состоянии хранилища до true
.
+ - text: Отправка loginUser
должна обновить authenticated
свойство в состоянии хранилища на true
.
testString: 'assert((function() { const initialState = store.getState(); store.dispatch(loginUser()); const afterLogin = store.getState(); return initialState.authenticated === false && afterLogin.authenticated === true })(), "Dispatching loginUser
should update the authenticated
property in the store state to true
.");'
- - text: Dispatching logoutUser
должен обновить authenticated
свойство в состоянии хранилища до false
.
+ - text: Отправка logoutUser
должна обновить authenticated
свойство в состоянии хранилища на false
.
testString: 'assert((function() { store.dispatch(loginUser()); const loggedIn = store.getState(); store.dispatch(logoutUser()); const afterLogout = store.getState(); return loggedIn.authenticated === true && afterLogout.authenticated === false })(), "Dispatching logoutUser
should update the authenticated
property in the store state to false
.");'
- - text: Функция authReducer
должна обрабатывать несколько типов действий с помощью оператора switch
.
+ - text: Функция authReducer
должна обрабатывать разные типы действий с помощью оператора switch
.
testString: 'getUserInput => assert( getUserInput("index").toString().includes("switch") && getUserInput("index").toString().includes("case") && getUserInput("index").toString().includes("default"), "The authReducer
function should handle multiple action types with a switch
statement.");'
```
@@ -46,9 +46,9 @@ const defaultState = {
};
const authReducer = (state = defaultState, action) => {
- // change code below this line
+ // измените код ниже этой линии
- // change code above this line
+ // измените код выше этой линии
};
const store = Redux.createStore(authReducer);
diff --git a/curriculum/challenges/russian/03-front-end-libraries/redux/use-const-for-action-types.russian.md b/curriculum/challenges/russian/03-front-end-libraries/redux/use-const-for-action-types.russian.md
index 1f5a88e71f..b5a7b4c449 100644
--- a/curriculum/challenges/russian/03-front-end-libraries/redux/use-const-for-action-types.russian.md
+++ b/curriculum/challenges/russian/03-front-end-libraries/redux/use-const-for-action-types.russian.md
@@ -4,35 +4,35 @@ title: Use const for Action Types
challengeType: 6
isRequired: false
videoUrl: ''
-localeTitle: Использовать const для типов действий
+localeTitle: Использование констант для типов действий
---
## Description
-const
. const
. LOGIN
и LOGOUT
как const
значения и назначьте их в 'LOGIN'
и 'LOGOUT'
строк соответственно. Затем отредактируйте authReducer()
и создателей действия, чтобы ссылаться на эти константы вместо строковых значений. Примечание. Обычно принято писать константы во всех прописных буквах, и это стандартная практика в Redux. LOGIN
и LOGOUT
как константы const
и присвойте им строковые значения 'LOGIN'
и 'LOGOUT'
соответственно. Затем отредактируйте authReducer()
и создателей действия, чтобы они ссылались на эти константы вместо строковых значений. Примечание. Обычно принято писать константы прописными буквами, и это стандартная практика в Redux. loginUser
должен вернуть объект с свойством type
установленным в строку LOGIN
.
+ - text: Вызов функции loginUser
должен вернуть объект со свойством type
, установленным в строку LOGIN
.
testString: 'assert(loginUser().type === "LOGIN", "Calling the function loginUser
should return an object with type
property set to the string LOGIN
.");'
- - text: Вызов функции logoutUser
должен вернуть объект с свойством type
установленным в строку LOGOUT
.
+ - text: Вызов функции logoutUser
должен вернуть объект со свойством type
, установленным в строку LOGOUT
.
testString: 'assert(logoutUser().type === "LOGOUT", "Calling the function logoutUser
should return an object with type
property set to the string LOGOUT
.");'
- - text: Магазин должен быть инициализирован объектом с идентификатором login
установленным в значение false
.
+ - text: Хранилище должно быть инициализировано объектом с идентификатором login
, установленным в значение false
.
testString: 'assert(store.getState().authenticated === false, "The store should be initialized with an object with property login
set to false
.");'
- - text: Dispatching loginUser
должен обновить свойство login
в состоянии store до true
.
+ - text: Отправка loginUser
должна обновить свойство login
в состоянии хранилища до true
.
testString: 'assert((function() { const initialState = store.getState(); store.dispatch(loginUser()); const afterLogin = store.getState(); return initialState.authenticated === false && afterLogin.authenticated === true })(), "Dispatching loginUser
should update the login
property in the store state to true
.");'
- - text: Dispatching logoutUser
должен обновить свойство login
в состоянии store до false
.
+ - text: Отправка logoutUser
должна обновить свойство login
в состоянии хранилища до false
.
testString: 'assert((function() { store.dispatch(loginUser()); const loggedIn = store.getState(); store.dispatch(logoutUser()); const afterLogout = store.getState(); return loggedIn.authenticated === true && afterLogout.authenticated === false })(), "Dispatching logoutUser
should update the login
property in the store state to false
.");'
- - text: Функция authReducer
должна обрабатывать несколько типов действий с помощью оператора switch.
+ - text: Функция authReducer
должна обрабатывать разные типы действий с помощью оператора switch.
testString: 'getUserInput => assert((function() { return typeof authReducer === "function" && getUserInput("index").toString().includes("switch") && getUserInput("index").toString().includes("case") && getUserInput("index").toString().includes("default") })(), "The authReducer
function should handle multiple action types with a switch statement.");'
- - text: LOGIN
и LOGOUT
должны быть объявлены как значения const
и должны быть назначены строки LOGIN
и LOGOUT
.
+ - text: LOGIN
и LOGOUT
должны быть объявлены как значения const
и должны быть проинициализированы строками LOGIN
и LOGOUT
.
testString: 'getUserInput => assert((function() { const noWhiteSpace = getUserInput("index").toString().replace(/\s/g,""); return (noWhiteSpace.includes("constLOGIN=\"LOGIN\"") || noWhiteSpace.includes("constLOGIN="LOGIN"")) && (noWhiteSpace.includes("constLOGOUT=\"LOGOUT\"") || noWhiteSpace.includes("constLOGOUT="LOGOUT"")) })(), "LOGIN
and LOGOUT
should be declared as const
values and should be assigned strings of LOGIN
and LOGOUT
.");'
- - text: Создатели действия и редуктор должны ссылаться на константы LOGIN
и LOGOUT
.
+ - text: Создатели действий и редуктор должны ссылаться на константы LOGIN
и LOGOUT
.
testString: 'getUserInput => assert((function() { const noWhiteSpace = getUserInput("index").toString().replace(/\s/g,""); return noWhiteSpace.includes("caseLOGIN:") && noWhiteSpace.includes("caseLOGOUT:") && noWhiteSpace.includes("type:LOGIN") && noWhiteSpace.includes("type:LOGOUT") })(), "The action creators and the reducer should reference the LOGIN
and LOGOUT
constants.");'
```
@@ -45,9 +45,9 @@ tests:
state
, но сначала рассмотрим все, что вы изучили до сих пор. state
, но сначала рассмотрим все, что вы изучили до сих пор. incAction
и decAction
создателей действий, в counterReducer()
, INCREMENT
и DECREMENT
типы действий, и , наконец, Redux store
. После того, как вы закончите , вы должны быть в состоянии направить INCREMENT
или DECREMENT
действия для увеличения или уменьшения состояния проводится в store
. Удачи в создании вашего первого приложения Redux! incAction
и decAction
, редуктор counterReducer()
, типы действий INCREMENT
и DECREMENT
, и, наконец, Redux хранилище store
. После того, как вы закончите , вы должны смочь отправить действия INCREMENT
или DECREMENT
для увеличения или уменьшения состояния в хранилище store
. Удачи в создании вашего первого приложения Redux! incAction
should return an action object with type
equal to the value of INCREMENT
");'
- text: Создатель действия decAction
должен возвращать объект действия с type
равным значению DECREMENT
testString: 'assert(decAction().type === DECREMENT, "The action creator decAction
should return an action object with type
equal to the value of DECREMENT
");'
- - text: Магазин Redux должен инициализировать с state
0.
+ - text: Хранилище Redux должно инициализироваться состоянием state
равным 0.
testString: 'assert(store.getState() === 0, "The Redux store should initialize with a state
of 0.");'
- - text: Dispatching incAction
в магазине Redux должен увеличивать state
на 1.
+ - text: Отправка incAction
в хранилище Redux должна увеличивать state
на 1.
testString: 'assert((function() { const initialState = store.getState(); store.dispatch(incAction()); const incState = store.getState(); return initialState + 1 === incState })(), "Dispatching incAction
on the Redux store should increment the state
by 1.");'
- - text: Отправка decAction
в хранилище Redux должна decAction
state
на 1.
+ - text: Отправка decAction
в хранилище Redux должна уменьшать state
на 1.
testString: 'assert((function() { const initialState = store.getState(); store.dispatch(decAction()); const decState = store.getState(); return initialState - 1 === decState })(), "Dispatching decAction
on the Redux store should decrement the state
by 1.");'
- text: counterReducer
должен быть функцией
testString: 'assert(typeof counterReducer === "function", "counterReducer
should be a function");'
@@ -41,16 +41,16 @@ tests: