javascript - 如何使用 redux 时间旅行并将其绑定(bind)到 ctrl + z 和 ctrl + shift + z 键绑定(bind)?

标签 javascript reactjs redux

我有一个编辑器应用程序,可以通过 redux 状态广告/更改/删除不同的 View ,我认为如果我可以通过 redux 时间旅行实现 ctrl+z 和 ctrl+shift+z ,这可能会非常有用,因为这意味着在用户错误删除元素的情况下获得更好的用户体验。

我试图阅读有关 redux 时间旅行的内容,但与之相关的所有内容都让我找到了 devtools 文章,因此我想看看你们是否知道任何好的资源或可以展示实现此功能的示例?

我的主要问题是在捕获关键事件后弄清楚逻辑。

最佳答案

如果您想跟踪用户的历史记录,您可以在商店内分配一个数组并允许每个操作进入,否则您可以使用 Window.localStorage以获得更持久的状态。 我以某种方式写下了一个相当简单的示例,其中包含“undo/CTRL+Z”监听器:

const rnd = (state = {
  num: 0,
  prev: []
}, action) => {
  switch (action.type) {
    case 'POPHISTORY':
      if (state.prev.length > 1) {
        state.num = state.prev[state.prev.length - 2];
        state.prev.splice(-1, 1);

      }
      return state;
        // Add a new number 
    case 'RND':
      const num = Math.round(Math.random() * 100);
            //push into the tracking array
      state.prev.push(num);
            //update the current number
      state.num = num;
      return state;
    default:
      return state;
  }
}

// JSX
const Counter = ({state, onRnd}) => (
  <div>
    <h2>{state.num}</h2>
    <h2>Previous numbers count:
      {state.prev.length}</h2>
    <button onClick={onRnd}>New number</button>
  </div>
);

// Create the store
const {createStore} = Redux;
const store = createStore(rnd); // bind reducers

//Listen for CTRL+Z
function KeyPress(e) {
  const evtobj = window.event
    ? event
    : e
  if (evtobj.keyCode == 90 && evtobj.ctrlKey) {
    store.dispatch({type: 'POPHISTORY'})
  }
}
//bind the listener
window.onkeydown = KeyPress;

//Create the renderer
const render = () => {
  ReactDOM.render(
    <Counter state={store.getState()} onRnd={() => store.dispatch({type: 'RND'})}/>, document.getElementById('root'));
};
// Combine React and Redux
store.subscribe(render);
render();

关于javascript - 如何使用 redux 时间旅行并将其绑定(bind)到 ctrl + z 和 ctrl + shift + z 键绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36086095/

相关文章:

javascript - 如何修复 "dispatch is not a function"错误

javascript - 无法使用 PUT 方法更新行 - MVC 4?

javascript - 如何在重新初始化之前销毁 JQuery 插件实例? (照片刷卡)

javascript - Jquery Slide Animation 滑动时改变高度

Javascript-如何突出显示与 HTML 中的表单用户输入文本区域匹配的元素数组

javascript - 导入获取请求?

html - Flexboxes : stacked, 居中、环绕、颜色匹配的边和动态、同步的宽度(见示例)

reactjs - 如何使用 React Hooks 在第一次渲染时加载带有 props 的子组件

javascript - 更新消费者之外的 react 上下文?

redux - TypeError : Object(. ..) 不是函数(redux)