- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用redux-undo
初始化可撤消的reducer的历史记录时遇到问题。 These are the directions I followed.加载当前
状态,但不加载过去
和 future
状态。我在这里托管代码,https://murmuring-shelf-40601.herokuapp.com我在中间件中添加了一个记录器,因此如果您打开控制台,您将看到撤消/重做历史记录。
这是我的商店。我将其包装在一个 promise 中,因为我从服务中获取历史记录,但我已将初始历史记录硬编码到initialHistory 对象以进行测试。 herokuapp.com 上托管的代码正在获取实时数据。
import { get } from 'axios'
import { applyMiddleware, createStore } from 'redux'
import { createLogger } from "redux-logger";
import thunk from "redux-thunk"
import { combineReducers } from 'redux'
import Promise from 'promise';
import UndoableNoteList from '../reducers/UndoableNoteList/UndoableNoteList'
var store = new Promise(function (resolve, reject) {
get("/server/load-notes").catch((response)=> {
const initialHistory = {
"UndoableNoteList": {
"present": {
"list": [
{
"id": "f5230212-8a46-4a48-91c1-5fadd4e4ae5e",
"text": "123123123123123123213"
},
{
"id": "bd4fe681-5071-4dd8-99e8-f46825eee866",
"text": "Jdk123123123123123123123sjdmd"
}
]
},
"past": [
{
"list": [
{
"id": "c60dc097-00ea-4dfa-9532-de44b25b1a7a",
"text": "Eggs"
},
{
"id": "f61997bc-c8d7-46d7-836f-44af50a1a70d",
"text": "Milk"
},
{
"id": "ab932fae-8588-4b20-a6c4-620c6a4345f7",
"text": "Cheese"
}
]
},
{
"list": [
{
"id": "f5230212-8a46-4a48-91c1-5fadd4e4ae5e",
"text": "Hhhfg"
},
{
"id": "bd4fe681-5071-4dd8-99e8-f46825eee866",
"text": "Jdksjdmd"
}
]
}
],
"future": []
}
};
const reducer = combineReducers({UndoableNoteList: UndoableNoteList});
const middleware = applyMiddleware(thunk, createLogger());
const store = createStore(reducer, initialHistory, middleware);
resolve(store);
});
});
export default store
这是我的不可撤销的 reducer 。
更新 - 此 reducer 存在一些问题。不要将其用作引用。
import undoable from 'redux-undo'
import {loadNotesComplete} from '../../actions/LoadNotesComplete'
import {loadNotesSuccess} from '../../actions/LoadNotesSuccess'
import {loadNotesFailure} from '../../actions/LoadNotesFailure'
import {saveNotesWaiting} from '../../actions/SaveNotesWaiting'
import {saveNotesPost} from '../../actions/SaveNotesPost'
import {saveNotesSuccess} from '../../actions/SaveNotesSuccess'
import {saveNotesFailure} from '../../actions/SaveNotesFailure'
import store from '../../store/Store'
const NoteList = (state = {}, action = {}) => {
if (action.type === "ADD_NOTE") {
state.currentNoteSaveState = "ADD_NOTE";
action.payload.then((note)=> {
state.list = state.list.concat(note);
store.then((store)=> {
store.dispatch(saveNotesWaiting(store.getState()));
});
});
} else if (action.type === "REMOVE_NOTE") {
state.currentNoteSaveState = "REMOVE_NOTE";
action.payload.then((id)=> {
state.list = state.list.filter(function (item) {
return item.id !== id;
});
store.then((store)=> {
store.dispatch(saveNotesWaiting(store.getState()));
});
});
} else if (action.type === "LOAD_NOTES") {
state.currentNoteSaveState = "LOAD_NOTES";
action.payload.then((response)=> {
response = {...response};
store.then((store)=> {
store.dispatch(loadNotesComplete(response));
});
}).catch((reject)=> {
console.log("reject from axios promise");
console.log(reject);
});
} else if (action.type === "LOAD_NOTES_COMPLETE") {
state.currentNoteSaveState = "LOAD_NOTES_COMPLETE";
action.payload.then((response)=> {
if (response.status >= 200 && response.status < 300) {
store.then((store)=> {
store.dispatch(loadNotesSuccess(response.data.UndoableNoteList));
});
}
else {
console.log("loadNotesFailure(response)");
store.then((store)=> {
store.dispatch(loadNotesFailure(response));
});
}
});
} else if (action.type === "LOAD_NOTES_SUCCESS") {
//console.log("action.payload");
//console.log(action.payload);
//state.currentNoteSaveState = "LOAD_NOTES_SUCCESS";
//state.list = action.payload.present.list;
} else if (action.type === "LOAD_NOTES_FAILURE") {
state.currentNoteSaveState = "LOAD_NOTES_FAILURE";
console.log(action.payload);
}
else if (action.type === "SAVE_NOTES_WAITING") {
state.currentNoteSaveState = "SAVE_NOTES_WAITING";
action.payload.then((notes)=> {
store.then((store)=>{
store.dispatch(saveNotesPost(notes));
});
}).catch(()=> {
console.log("canceling previous save");
});
} else if (action.type === "SAVE_NOTES_POST") {
state.currentNoteSaveState = "SAVE_NOTES_POST";
action.payload.then((response)=> {
if (response.status >= 200 && response.status < 300) {
store.then((store)=>{
store.dispatch(saveNotesSuccess(response));
});
} else {
store.then((store)=>{
store.dispatch(saveNotesFailure(response));
});
}
});
} else if (action.type === "SAVE_NOTES_SUCCESS") {
state.currentNoteSaveState = "SAVE_NOTES_SUCCESS";
} else if (action.type === "SAVE_NOTES_FAILURE") {
state.currentNoteSaveState = "SAVE_NOTES_FAILURE";
} else if (action.type === "UNDO") {
state.currentNoteSaveState = "UNDO";
action.payload.then(()=> {
store.then((store)=>{
store.dispatch(saveNotesWaiting(store.getState()));
});
});
} else if (action.type === "REDO") {
state.currentNoteSaveState = "REDO";
action.payload.then(()=> {
store.then((store)=> {
store.dispatch(saveNotesWaiting(store.getState()));
});
});
}
console.log(action.type);
console.log(state);
state = {...state};
return state;
};
const UndoableNoteList = undoable(NoteList, {
filter: function filterActions(action, currentState, previousHistory) {
return action.type === "ADD_NOTE" ||
action.type === "REMOVE_NOTE";
}
});
export default UndoableNoteList;
这是我设置提供程序的 index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux'
import Layout from './pages/Layout';
import './index.css';
import {Router, Route, IndexRoute, hashHistory } from "react-router"
import Home from './pages/Home/Home';
import ListView from './pages/ListView/ListView'
import ListAdd from './pages/ListAdd/ListAdd'
import store from './store/Store'
store.then((store)=> {
ReactDOM.render(
<Provider store={store}>
<Router history={hashHistory}>
<Route path="/" component={Layout}>
<IndexRoute component={Home} name="Home"></IndexRoute>
<Route path="/view-notes" component={ListView} name="ViewNotes"></Route>
<Route path="/add-note" component={ListAdd} name="AddNote"></Route>
</Route>
</Router>
</Provider>,
document.getElementById('root')
);
});
最佳答案
我将 redux-undo
库从 0.6.1
更新到 1.0.0-beta7
,现在历史记录已正确填充
关于reactjs - redux-undo 的初始化历史记录不会填充过去或 future ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43400369/
这是关于非标准属性的。 https://facebook.github.io/react/docs/tags-and-attributes.html 在 react 中我做了这个: React.cr
我制作了 2 个组件:1)内容(使用 fetch() 显示数据)2)分页(共5页,每页16个对象) 我创建了 2 个状态变量,分别称为 start:0 和 end:16。现在,每当用户单击页码时,我都
我们正在使用 ReactJS 创建一个搜索前端。要求是当用户单击文档名称时,该文档必须在嵌入式查看器中打开。有人为此使用过任何 ReactJS 组件吗?否则,我应该使用 JQuery 查看器组件吗?请
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 1 年前。
我现有的项目: 前端框架 - PHP Codeigniter 和 PHP Laravel 后端框架 - JAVA Springboot 我正在尝试将前端框架更改为 ReactJS。我想知道与 Reac
我有一个实现刷新授权 token 的方案。在这种情况下,我为每种操作(发布、获取、删除)实现了一个通用操作,并使用参数调用它们。 export function Get(param) { return
我现在有 { _this.setState({startDate: input})}}/> 无论我一直在改变什么(onChange 部分到 ref 等等),当我 console.log 我的状态时,
我在两个不同的文件中有两个单独的组件 组件A 和 组件B 我在 中有一个按钮组件B 现在我想测试当 中的特定按钮时组件B 被点击,组件A 应呈现如下: import { render, screen,
我有一个包含几个问题的表格。一些问题有一组子问题。 这些是使用以下代码呈现的。 { Object.keys(this.props.moduleDetails.questions).map(
我有两个组件。第一个状态初始化: import React from 'react'; class One extends React.Component { constructor(prop
我的项目是一个对象数组,我只获取名称并在 3 in 3 的屏幕上渲染,使用“下一个”和“上一个”按钮更改名称,并且可以过滤字母。 我想要添加一个新值,在输入中键入并单击按钮添加。 我的代码按钮: ad
我有一个组件实例,应该从不同的地方更新。如何从其他几个组件中更新此组件的 props? class ParentComponent extends React.Component { ...
我想问,是否可以基于变量返回一个组件,我的想法是否可以: var location = this.props.location // Eg. Asia,Australia 我的问题是我需要单独手动导
有没有办法在渲染后立即选择要覆盖的文本?我的意思是选择 - 最佳答案 您可以尝试使用两种方法.focus和.select .focus() method sets focus on the speci
我渲染了以下内容: 这是事件处理程序: handleCompanySubmit(event) { console.log("company submit") e
作为ReactJS的初学者,我现在使用出色的ReactJS Datepicker。有关我的自定义日期格式的问题: 我没有找到任何文档来解释所有可能性,例如M是月份,MM是2个字母的月份,依此类推。(我
我创建了一个表并正在对其进行过滤,但是当我清除搜索查询时,表数据不会显示,并且表会卡在查询结果上。SearchBox 是文本框,TableData 是表格,在 Container 中我正在更改 Sea
我在表格设置中有图标,这样当单击图标时,会呈现不同的图标。现在这工作正常,但我想为我单击的行中的特定行重新呈现不同的图标,而不是在每一行中重新呈现不同的图标。不知道我将如何去做这件事。这是我的代码:
我正在尝试使用 React 构建一个简单的应用程序,它有两个组件,一个嵌入另一个组件。子组件是一个收缩的菜单,单击它时,它会展开。我希望能够在单击父元素或子元素失去焦点时重新收缩它。 这是父组件的样子
我需要知道 REACT JS 或 HTML5 中是否有任何 API 可以提供用户不活动时自动注销的功能。我的代码如下,我不知道出了什么问题,它给了我错误 startTimer 未定义和不必要的绑定(b
我是一名优秀的程序员,十分优秀!