- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 cycleJS 制作一个表情符号查看器应用程序,用户可以在其中单击任何表情符号以将其添加/从他们的收藏夹列表中删除。每次更改时,该列表也会保存到 localstorage
。我正在使用 folding 的 xstream 构建列表点击流(在每次点击时添加或删除表情符号):
const favEmojis$ = clickFavEmoji$.fold(
(favList, selectedEmoji) =>
favList.includes(selectedEmoji)
? favList.filter(emoji => emoji !== selectedEmoji)
: [...favList, selectedEmoji],
[]
);
我能够将此流保存到 localStorage
并使用 @cycle/storage 将其加载到页面上司机:
const storageRequest$ = favEmojis$.map(favEmojis => ({
key: "favEmojis",
value: JSON.stringify(favEmojis)
}));
...
return {
DOM: vdom$,
...
storage: storageRequest$
};
}
但是,我不知道如何将数组从 localStorage 预加载到收藏夹流中。从 localStorage
加载数组后,我尝试以我能想到的所有方式将它与 favEmojis$
流合并/连接。例如:
const storedEmojis$ = localStorage
.getItem("favEmojis")
.map(favEmojis => (favEmojis ? JSON.parse(favEmojis) : []))
.take(1);
const combinedFav$ = xs.merge(storedEmojis$, favEmojis$);
但这不起作用 - 来自 localstorage
的数组被折叠的 clickFavEmoji
流覆盖。如果有人能指出正确的方向,我将不胜感激。
注意完整的代码很长,所以我只包含了看起来最相关的部分。
最佳答案
这里的问题是你有两个事实来源:
这两个来源根本不相互依赖,因此您会遇到奇怪的行为。
一个可行的解决方案是从 clickFav$
和 storedEmojis$
中创建 reducer,将它们合并并折叠在一起。
这是它的样子:
const clickReducer$ = clickFavEmoji$.map(
(favEmojis, selected) => /* same as you previous reducer */
);
const storedEmojisReducer$ = localStorage
.getItem("favEmojis")
.take(1)
.map(/* serialise to json */)
.map((state, favEmojis) => favEmojis) // here we just replace the whole state
const favEmojis$ = xs
.merge(storedEmojisReducer$, clickReducer$)
.fold(
(favEmojis, reducer) => reducer(favEmojis)
, [])
return {
DOM: favEmojis$.map(render)
}
这样,localStorage 中的值与在应用程序生命周期中演变的值之间存在明确的关系。
onionify
现在,之前的解决方案运行良好。当 reducer 被调用时,它知道 localStorage 给出的先前值。但是,如果您仔细查看创建 favEmojis$
的代码,就会发现它非常杂乱无章。它没有特定的业务逻辑,只是愚蠢地调用给定的 reducer。
onionify
( https://github.com/staltz/cycle-onionify ) 通过将对 reducer 的所有调用集中在一个点并将新状态重新注入(inject)到应用程序的源中,极大地简化了循环应用程序中管理状态的过程.
代码与以前的版本相比没有太大变化,变化是:- 状态将作为组件的显式依赖项注入(inject);- 您不必手动调用 reducer 。
function Component({ DOM, onion /* ... */ }) {
const clickReducer$ = /* same as before */
const storedEmojisReducer$ = /* same as before */
return {
DOM: onion
.state$ // the state is now inside onionify
.map(render),
// send the reducers to onionify
onion: xs.merge(storedEmojisReducer$, clickReducer$)
}
}
关于javascript - 在 CycleJS 中用 localStorage 的初始值折叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47964383/
我正在尝试学习 cyclejs 和响应式编程,但我不知道如何使用值来管理事件。 例如,我需要创建四个函数来进行一些数学运算,例如: 补充 减法 师 乘法 这是我的代码: function main (
我想开始我的第一个 Cycle.js 项目,我将与 friend 一起开发它。他是一名 HTML 设计师(对 HTML 和 CSS 非常了解,并且他创建了 Handlebars 模板),我对 JS 略
我尝试使用Cyclejs/xstream创建一个简单的待办事项应用程序。该应用程序运行良好。我唯一无法理解的是添加每个待办事项后输入应该清除,但这没有发生。 todo.js import {
我尝试通过 SystemJS 从他们的 CDN 加载 Cycle DOM,例如: System.config({ map: { 'cycle-dom': 'https://unpkg.co
我正在尝试从记录其 map 运算符内部的数组创建流,但我的代码似乎出了点问题,我无法指出... import {Slider} from './slider/slider' import xs fro
假设我有一个返回用户详细信息的 API:/api/get_user/1 { "status": 200, "data": { "username": "username1",
我必须将 token 保存在浏览器的 cookie 中(在我的例子中是 Chrome)。我发现https://github.com/10clouds/cyclejs-cookie该资源并安装了0.5.
我一直在尝试创建一些cycle.js 示例作为嵌套对话,并使用选择框在它们之间进行切换。 其中一个对话是官方 Github HTTP 搜索示例的克隆。 另一个对话是一个更基本的对话,没有 HTTP,只
给定一个用 CycleJs 构建的独立组件(该组件工作正常): import isolate from '@cycle/isolate'; import { div, ul, li, a } from
我正在尝试使用 CycleJS HTTP 驱动程序向 REST 端点发出请求,但我获取输入字段值的方式不是响应式的,但我无法找到一种方法来做它(正确的方式) 用户案例: 用户填写用户名和密码字段,然后
我已经编写了一个 Spring Controller ,它在请求中接收 json 并响应 pdf 文件。 public ResponseEntity generateResp(...) by
我正在努力研究 CycleJS,但我被卡住了!我正在尝试将一个小应用程序放在一起加载一个包含对象数组的 JSON 文件,但我无法让该应用程序执行 http 请求 到目前为止在我的代码中 'use st
我正在使用 cycleJS 制作一个表情符号查看器应用程序,用户可以在其中单击任何表情符号以将其添加/从他们的收藏夹列表中删除。每次更改时,该列表也会保存到 localstorage。我正在使用 fo
Bower:我找不到 @Cycle/Core、@Cycle/DOM 的 Bower 包,这些库是否存在?我很困惑为什么首先会有一个 NPM 包,因为 Cycle.js 是基于前端的(而 NPM 专门用
我正在研究 cyclejs,但在处理如何使 div 移动时遇到了一些麻烦。 首先,我隔离了 3 个我必须计算的事件 鼠标按下 鼠标弹起 鼠标移动 目的是在 map 按下和鼠标移动时产生移动,并在我鼠标
使用 vanilla JavaScript,我将执行以下操作以将 h1 标记添加到 iframe 主体: var doc = document.getElementById('iframe').con
我正在玩cyclejs,我试图找出处理许多源/意图的惯用方法应该是什么。我在下面有一个简单的 Cyclejs 程序,用 TypeScript 编写,并对最相关的部分进行了注释。 您是否应该像在 Elm
我想知道 Cycle.js、motorcycle.js、most.js 和 snabbdom 是否有 tsd 定义。 最佳答案 不,还没有。但它们将在即将发布的版本中出现(我们目前正在努力)。 关于c
我正在尝试获取一个包含 10 个对象的随机 Observable 流,每个对象都具有如下属性: {tileNum: '6', tileName: 'game-of-thrones' clickCoun
我正在学习 CycleJS,我发现在使用 Cycle 的 HTTP 驱动程序时,我必须使用 RxJS switch/mergeAll 合并 response stream 流 以达到流级别.但是当我尝
我是一名优秀的程序员,十分优秀!