我有一个更新我的应用程序的通知状态的操作.通常,此通知将是某种错误或信息.我需要在5秒后发送另一个操作,将通知状态返回到初始状态,因此不会发出通知.这背后的主要原因是提供通知在5秒后自动消失的功能.
我没有运气使用setTimeout
和返回另一个动作,也无法找到如何在线完成.所以欢迎任何建议.
我在其他问题中看到了相互矛盾(或者只是让我感到困惑)关于getState
在一个动作中使用是否可接受的答案,而且我已经看过很多次它被称为反模式.对我来说,它似乎工作得很好,但如果我们不使用它,最好的做法是什么getState
?
我getState
在一个thunk中使用来过滤当前连接到某些模拟数据并被拉入应用程序状态的用户数组.
这是我的行动代码:
export const accountLogInSuccess = user => ({
type: types.ACCOUNT_LOG_IN_SUCCESS,
user,
});
export const accountLogOutSuccess = () => ({
type: types.ACCOUNT_LOG_OUT_SUCCESS,
});
export const accountCheckSuccess = () => ({
type: types.ACCOUNT_CHECK_SUCCESS,
});
export const accountCheck = () => (
(dispatch, getState) => {
dispatch(ajaxCallBegin());
return apiAccount.accountCheck().then((account) => {
if (account) {
const user = findByUID(getState().users, account.uid);
dispatch(accountLogInSuccess(user));
toastr.success(`Welcome ${user.nameFirst}!`);
} else {
dispatch(accountLogOutSuccess());
}
dispatch(accountCheckSuccess());
}).catch((error) => {
dispatch(ajaxCallError(error));
toastr.error(error.message);
throw (error); …
Run Code Online (Sandbox Code Playgroud) 我有这样的 action.js 文件:
import axios from 'axios';
export const SEARCH_TERM = 'SEARCH_TERM';
export const SAVE_SEARCH = 'SAVE_SEARCH';
export function search(query) {
const githubApi = `https://api.github.com/search/repositories?q=${query}&sort=stars&order=desc`;
const request = axios.get(githubApi);
return (dispatch) => {
request.then(({ data: dataFromGithub }) => {
dispatch({ type: SEARCH_TERM, payload: query });
dispatch({ type: SAVE_SEARCH, payloadOne: query, payloadTwo: dataFromGithub });
});
};
}
Run Code Online (Sandbox Code Playgroud)
使用减速器,我将用户输入的所有搜索词保存到 redux 中。然后我向 github api 发出请求并保存响应数据。
现在我遇到了一个问题,我真的不知道如何处理。
我如何编写代码来检查用户之前是否已经搜索过此查询,在这种情况下,我的应用程序不会向 github api 触发该请求。
我该如何做到这一点以及我应该将这个逻辑放在哪里?有任何想法吗?
编辑:感谢@klugjo!由于他的提示,我编写了确实有效的代码。
import React, { Component } from 'react';
import { connect } …
Run Code Online (Sandbox Code Playgroud) 我目前收到错误 TypeError: getState is not a function 我正在尝试类似于http://redux.js.org/docs/advanced/AsyncActions.html中的示例的操作
action.js - 此处发生错误
export const fetchCategoriesIfNeeded = (dispatch, getState) => {
if(shouldFetchCategories(getState())){
return dispatch(fetchCategories())
}
}
Run Code Online (Sandbox Code Playgroud)
应用程序.js
componentDidMount(){
this.props.dispatch(fetchCategoriesIfNeeded())
}
Run Code Online (Sandbox Code Playgroud)
...
const mapStateToProps = (state, props) => {
return {
isFetching: state.isFetching,
categories: state.categories
}
}
Run Code Online (Sandbox Code Playgroud)
减速器.js
function data (state = initialState, action){
switch(action.type){
case RECEIVE_CATEGORIES:
return {
...state,
isFetching: false,
categories: action.categories
}
case REQUEST_CATEGORIES:
return {
...state,
isFetching: true
}
default:
return state
}
return state
}
Run Code Online (Sandbox Code Playgroud)
为了可读性省略了一些代码。
我也尝试过这个并收到 …
在下面的示例中,从 firebase 获取数据后,我想添加 redux 存储中已经存在的用户对象并将其附加到所有消息对象中。请求你帮忙。
db.collection(`messages/${documentId}/chat`)
.get()
.then(snapshot => {
const messages = [];
snapshot.docs.forEach(doc => {
console.log("message", doc.id, doc.data());
messages.push({
id: doc.id,
from: doc.data().from,
to: doc.data().to,
text: doc.data().text,
timestamp: doc.data().timestamp.seconds * 1000
});
});
dispatch({ type: GET_CHAT, payload: messages });
});
Run Code Online (Sandbox Code Playgroud) 我有一个具有以下状态的 Redux 减速器:
const INITIAL_STATE = {
permissions: [''],
authzError: null
};
Run Code Online (Sandbox Code Playgroud)
我已经有一些修改 state.permissions 的 Redux 操作。我正在编写以下操作来运行权限检查:
export function isAuthz(allowed, except) {
// I need state.permissions here
...
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以这样做:
export function isAuthz(allowed, except, permissions) {
// Now do permission check
...
}
Run Code Online (Sandbox Code Playgroud)
但这意味着将 state.permissions 拉出组件中,然后将其放入 isAuthz 操作中,这似乎是一种浪费且容易出错。我可以只检查减速器中的权限,但我认为一个动作是我应该这样做的地方。
我应该在哪里进行此权限检查以及如何获取 state.permissions ?
谢谢,
沃伦
react-redux ×4
redux ×4
javascript ×3
getstate ×2
react-native ×2
redux-thunk ×2
api ×1
asynchronous ×1
node.js ×1
reactjs ×1
timeout ×1