首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >redux中间件如何将数据添加到存储区?

redux中间件如何将数据添加到存储区?
EN

Stack Overflow用户
提问于 2016-11-03 13:14:26
回答 3查看 1.5K关注 0票数 0

背景

我正在创建一个通用的redux应用程序和redux路由器。我拥有大多数的应用程序设置,包括服务器端呈现和基本的redux操作(修改存储中的布尔值)。现在,我想调用一些api来获取我的应用程序的数据。

目前执行情况

我认为使用redux中间件是个好主意,但我无法将数据添加到存储中。我跟踪了文档并创建了一个类似于此的操作。

example-action.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { CALL_API } from `redux-api-middleware`;


export function fn_get_data () {
  [CALL_API]: {
    endpoint: 'http://www.example.com/api/users',
    method: 'GET',
    types: ['REQUEST', 'SUCCESS', 'FAILURE']
  }
}

我在页面中单击一个按钮运行此操作。我看到行动被解雇了,但商店里什么也没有。我甚至为SUCCESS操作添加了一些自定义代码,并且能够console.log()响应,但仍然无法将数据输入存储区。

此外,我还按照文档所述的方式向商店添加了中间件。

configureStore.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { createStore, applyMiddleware, combineReducers } from 'redux';
import { apiMiddleware } from 'redux-api-middleware';
import reducers from './reducers';

const reducer = combineReducers(reducers);
const createStoreWithMiddleware = applyMiddleware(apiMiddleware)(createStore);

export default function configureStore(initialState) {
  return createStoreWithMiddleware(reducer, initialState);
}

到目前为止

到目前为止,我已经尝试了一系列不同的操作,比如将操作转换为可导出的符号,并在还原器中调用它们,并尝试将数据合并到来自redux中间件中的payload属性的当前状态,但没有成功。

问题

我真的有两个问题

  • 为什么文档中没有减缩器,这只是被忽略了,还是响应中的数据直接进入了存储区?
  • 为什么我调用的数据不被添加到商店(我丢失了什么)?

对此问题的任何帮助、解释或建设性的批评都是非常感谢的,谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-04 01:14:24

解决方案

正如markerikson所说,库只为您提供工具,您仍然需要编写还原剂来响应操作。在我的例子中,我终于得到了以下减速器的数据。

example-reducer.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import * as ExampleActionType from "../action/example-action";
import Immutable from "immutable";

let defaultState = Immutable.fromJS({
  fakeData: {}
});

function exampleState (state = defaultState, action) {
  switch (action.type) {

    case ExampleActionType.REQUEST : {
        console.log(action);
        return state;
    }

    case ExampleActionType.SUCCESS : {
        console.log(action);
        return state.merge({fakeData: action.payload });
    }

    case ExampleActionType.FAILURE : {
        console.log(action);
        return state;
    }

    default:
        return state;
  }
}

我还得导出像这样的符号

example-action.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export const REQUEST = Symbol('REQUEST');
export const SUCCESS = Symbol('SUCCESS');
export const FAILURE = Symbol('FAILURE');

结论

非常棒的库,它为您提供了创建api请求所需的所有工具,只需很少的代码。希望这能帮助像我一样对这件事感到困惑的人。

票数 2
EN

Stack Overflow用户

发布于 2016-11-03 13:18:25

据我所见,redux-api-middleware提供了一堆用于进行API调用、分发成功/失败操作以及可能处理一些响应的工具。然而,你在减速机中如何处理这些动作取决于你自己。因此,如果您要求中间件分派"MY_REQUEST_SUCCESS",则需要在还原器逻辑中添加一个"MY_REQUEST_SUCCESS"处理程序,并适当地更新状态。

票数 2
EN

Stack Overflow用户

发布于 2018-08-10 09:12:46

redux-api-middleware不打算将数据存储到存储区(这就是不需要设置任何减缩器的原因)。实际上,我构建了一个库redux-缓存-api-中间件,它在redux-api-middleware之上充当一个瘦层,并添加了缓存(可以很容易地用作一个简单的存储)功能。

下面是一个示例组件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import api from 'redux-cached-api-middleware';
import Items from './Items';
import Error from './Error';

class ExampleApp extends React.Component {
  componentDidMount() {
    this.props.fetchData();
  }

  render() {
    const { result } = this.props;
    if (!result) return null;
    if (result.fetching) return <div>Loading...</div>;
    if (result.error) return <Error data={result.errorPayload} />;
    if (result.successPayload) return <Items data={result.successPayload} />;
    return <div>No items</div>;
  }
}

ExampleApp.propTypes = {
  fetchData: PropTypes.func.isRequired,
  result: PropTypes.shape({}),
};

const CACHE_KEY = 'GET/items';

const enhance = connect(
  state => ({
    result: api.selectors.getResult(state, CACHE_KEY),
  }),
  dispatch => ({
    fetchData() {
      return dispatch(
        api.actions.invoke({
          method: 'GET',
          headers: { Accept: 'application/json' },
          endpoint: 'https://my-api.com/items/',
          cache: {
            key: CACHE_KEY,
            strategy: api.cache
              .get(api.constants.CACHE_TYPES.TTL_SUCCESS)
              .buildStrategy({ ttl: 10 * 60 * 1000 }), // 10 minutes
          },
        })
      );
    },
  })
);

export default enhance(ExampleApp);

这项工作以缓存的方式进行,但您可以轻松地传递自定义的shouldFetch函数,并且您将始终从API中重新获取:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const enhance = connect(
  state => ({
    result: api.selectors.getResult(state, CACHE_KEY),
  }),
  dispatch => ({
    fetchData() {
      return dispatch(
        api.actions.invoke({
          method: 'GET',
          headers: { Accept: 'application/json' },
          endpoint: 'https://my-api.com/items/',
          cache: {
            key: CACHE_KEY,
            shouldFetch: () => true
          },
        })
      );
    },
  })
);

设置如下(注意api还原器,它实际上处理对redux状态的存储响应):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { createStore, combineReducers, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import { apiMiddleware } from 'redux-api-middleware';
import api from 'redux-cached-api-middleware';
import reducers from './reducers';

const store = createStore(
  combineReducers({
    ...reducers,
    [api.constants.NAME]: api.reducer,
  }),
  applyMiddleware(thunk, apiMiddleware)
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40411348

复制
相关文章
redux-thunk中间件
最近在看redux,主要是redux官方教程(参考文章1)和网上文章(参考文章2),基础部分已经看完,正在理解middleware中间件部分,自我感觉中间件的思想不难理解,主要是它的实现方式涉及到函数式编程,真的太抽象了。redux-thunk是一种中间件,它能使你在action creator中返回函数,此返回函数就是thunk函数,模拟一下就是
张宗伟 plus
2022/10/28
5560
Redux中间件的原理
我们在react中使用redux时有时候需要使用redux的中间件,那么redux的中间件是如何是实现的呢?看代码:
挥刀北上
2021/01/22
5280
Redux中间件的原理
简析redux技术栈(一):redux中间件
从上面可以看到,一个中间件函数要最后完成,需要再执行前经过两次的初始化(分别传入 store 和 next 方法),然后到最后的调用
ACK
2020/01/14
5760
Redux异步解决方案 1. Redux-Thunk中间件
简单介绍一下thunk,这是一个中间件,是解决redux异步问题产生的。我们都知道,在使用redux的时候,通过dispatch一个action 发生到reducer 然后传递给store修改状态 一系列都是同步的,那如果说我dispatch一个action 这个action帮我请求一下接口数据,你发现接口请求是异步的,没有办法等接口数据返回再传递给reducer 这个时候中间件就产生啦。 redux比较常用的中间件有 redux-saga、redux-thunk、redux-promise等 都是为了解决dispatch action异步处理问题
憧憬博客
2020/07/21
1.3K0
针对数据存储区的攻击测试
学习打卡计划是信安之路知识星球开启的 “每天读书一小时,挑战打卡一百天” 主题活动,能够坚持学习打卡 100 天的同学可以获得信安之路提供的百分成就徽章和证书,学习书籍可以自选,主要目的是养成每日读书学习的好习惯,并将自己的学习心得分享出来供大家学习。
信安之路
2021/01/07
7150
Redux 异步解决方案2. Redux-Saga中间件
因为Generator。结合yield  yield操作符会获取右边表达示的值返回 可以用于异步变同步操作 中间件的特性: 以前的 action -> reducers -> store 现在的 action -> middleware -> reducers -> store
憧憬博客
2020/07/21
1.1K0
redux-thunk 中间件的示例
Redux处理异步任务——异步数据流中间件:redux-thunk & action是一个函数,函数内部处理异步任务
用户9914333
2022/07/22
5650
消息中间件—Kafka数据存储(一)
摘要:消息存储对于每一款消息队列都非常重要,那么Kafka在这方面是如何来设计做到高效的呢? Kafka这款分布式消息队列使用文件系统和操作系统的页缓存(page cache)分别存储和缓存消息,摒弃了Java的堆缓存机制,同时将随机写操作改为顺序写,再结合Zero-Copy的特性极大地改善了IO性能。而提起磁盘的文件系统,相信很多对硬盘存储了解的同学都知道:“一块SATA RAID-5阵列磁盘的线性写速度可以达到几百M/s,而随机写的速度只能是100多KB/s,线性写的速度是随机写的上千倍”,由此可以看出对磁盘写消息的速度快慢关键还是取决于我们的使用方法。鉴于此,Kafka的数据存储设计是建立在对文件进行追加的基础上实现的,因为是顺序追加,通过O(1)的磁盘数据结构即可提供消息的持久化,并且这种结构对于即使是数以TB级别的消息存储也能够保持长时间的稳定性能。在理想情况下,只要磁盘空间足够大就一直可以追加消息。此外,Kafka也能够通过配置让用户自己决定已经落盘的持久化消息保存的时间,提供消息处理更为灵活的方式。本文将主要介绍Kafka中数据的存储消息结构、存储方式以及如何通过offset来查找消息等内容。
用户2991389
2018/09/05
9030
消息中间件—Kafka数据存储(一)
如何将WebRTC播放协议添加到EasyCVR?
自2020年浏览器的发展和兼容性发生了变化,WebRTC的延时性、安全性得到了提升和保护,尤其是疫情爆发后,实时视频的需求比之前增长了30倍,这更刺激了WebRTC产品的持续快速发展。因此我们也在EasyGBS、EasyDSS等平台内实现了WebRTC协议的播放。
TSINGSEE青犀视频
2021/11/23
1.4K0
一步一步教你把 Redux Saga 添加到 React&Redux 程序中
applyMiddleware 是一个辅助函数,为 redux 的 dispatch 函数添加了功能。
winty
2020/08/16
1K0
学习 redux 源码整体架构,深入理解 redux 及其中间件原理
感兴趣的读者可以点击阅读。 其他源码计划中的有:express、vue-rotuer、redux、 react-redux 等源码,不知何时能写完(哭泣),欢迎持续关注我(若川)。
若川
2020/06/22
1.5K0
在 CentOS 上如何将用户添加到 Sudoers
sudo是一个命令行工具,它被设计为允许用户以其他用户(默认是 root 用户)身份去运行命令。
雪梦科技
2020/05/11
11.5K0
在 CentOS 上如何将用户添加到 Sudoers
在 Debian 中如何将用户添加到 Sudoers
sudo是一个命令行工具,它允许被信任用户以另外一个用户身份运行命令,默认是 root 用户。
雪梦科技
2020/05/11
12.6K0
在 Debian 中如何将用户添加到 Sudoers
深入理解Redux之中间件(middleware)
redux深入理解之中间件(middleware) 理解reduce函数 reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值。 arr.reduce([callback, initialValue]) 关于reduce的用法,这里不再做多述,可以去这里查看 看如下例子: let arr = [1, 2, 3, 4, 5]; // 10代表初始值,p代表每一次的累加值,在第一次为10 // 如果不存在初始值,那么p第一次值为1 //
糊糊糊糊糊了
2018/05/09
8950
在 Ubuntu 中如何将用户添加到 Sudoers
sudo是一个命令行程序,它允许被信任的用户以 root 或者其他用户身份去运行命令。
雪梦科技
2020/05/09
34.4K0
在 Ubuntu 中如何将用户添加到 Sudoers
zabbix 5.0如何将esxi6.7添加到监控
今天有个需求,需要将一台esxi 6.7 server添加到我们的zabbix监控服务器上,将我做的操作踩的一点坑写出来
姚华
2022/06/29
1.8K0
zabbix 5.0如何将esxi6.7添加到监控
express, koa, redux三者中间件对比
Link: http://yoursite.com/2018/09/14/express-koa-redux三者中间件对比/
落落落洛克
2021/01/08
6880
express, koa, redux三者中间件对比
React-Redux-Saga
如上自定义函数已经获取到了网络数据,添加到 Redux 中保存是通过 Saga 提供的 put 方法进行添加即可,在更改 store.js 告诉 saga 中间件的生成器哪些通过 dispatch 派发的 action 需要进行拦截, 在 run 方法进行指定:
杨不易呀
2023/10/01
2180
React-Redux-Saga
Redux的中间件Middleware不难,我信了^_^
Redux的action和reducer已经足够复杂了,现在还需要理解Redux的中间件。为什么Redux的存在有何意义?为什么Redux的中间件有这么多层的函数返回?Redux的中间件究竟是如何工作的?本文来给你解惑,Redux中间件从零到“放弃”。
小美娜娜
2019/04/04
5440
Redux的中间件Middleware不难,我信了^_^
点击加载更多

相似问题

数据未存储在redux存储区中。

24

如何将变量存储在Redux存储区中?

12

Redux中间件访问存储

11

如何将上传的值存储到redux存储区

10

Redux Promise中间件+ Redux模拟存储测试

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文