首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RxJS状态管理

RxJS状态管理
EN

Stack Overflow用户
提问于 2020-06-08 22:34:59
回答 1查看 55关注 0票数 0

如何使用RxJS Observable保存React应用的状态。当我将新项目添加到CRUD应用程序后刷新页面时,它没有在列表中保存新项目,新添加的项目消失了。根据app的逻辑,页面刷新后,新的项应该保存在本地存储中。

EN

回答 1

Stack Overflow用户

发布于 2020-06-09 07:23:39

下面是一个示例,说明如何实现

代码语言:javascript
复制
const { useState, useEffect, useRef } = React;
const { BehaviorSubject, of, operators: { switchMap, tap } } = rxjs;

const mockLocalStorage = {
  values: `["one","two","three"]`,
  getItem(key) {
    return this.values
  },
  setItem(key, value) {
    this.values = value
  }
}

const App = () => {
  const [list, setList] = useState([]);
  const [value, setValue] = useState('');
  const ref = useRef(new BehaviorSubject(undefined));
  
  useEffect(() => {
    const subscription = ref.current
      .pipe(switchMap(_ => 
        of(JSON.parse(mockLocalStorage.getItem('key'))))
        )
      .subscribe(values => {
        setList(values);
      })
    
    return () => {
      subscription.unsubscribe();
    }
      
  }, [])
  
  const onChange = ({key, target: {value}}) => setValue(value)
  
  const addItem = ({key, target: {value}}) => {
    if (key !== 'Enter') {
      return;
    }
  
    const state = [...list, value];
    mockLocalStorage.setItem('key', JSON.stringify(state))
    ref.current.next(state);
    setValue('');
  }

return <div>
  {list.map(item => <div key={item}>{item}</div>)}
  <input type="text" value={value} onChange={onChange} onKeyDown={addItem} placeholder="Enter item and press enter..."/>
</div>
}

ReactDOM.render(
    <App />,
    document.getElementById('root')
  );
代码语言:javascript
复制
<script src="https://unpkg.com/react/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.5/rxjs.umd.js"></script>
</script>
<div id="root"></div>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62264487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档