Open puddlejumper26 opened 4 years ago
简单很多,不用再为一个组件写很多的服务
=========================
3
4
5
ng add@ngrx/store
- 安装ngrx/store插件 -ng add @ngrx/store-devtools
- 调试插件maxAge
等配置. 我们这里放在 下面创建的 AppStoreModule中
StoreDevtoolsModule.instrument({
maxAge: 20, //最多纪录20条
logOnly: environment.production //在生产的环境下生效,开发的环境下需要更多的功能
})
xxx.module.ts
的文件因为需要进行注册.一般都是 ng g m store
建立一个 store.module.ts
. 这个APP中的名字是 index.ts 但是导出的module名字是 AppStoreModule
actions
,reducers
,selectors
的文件夹,之后放入相关的ts文件actions
createAction
来创建
// 第一个参数是一个标识符,用来语义化这个是在干什么
// props 用来接收一个对象 是一个 {key:values}的对象 key 是string, values 是 any,根据情况设定, 后面有(),是调用
export const SetPlaying = createAction('[player] Set playing', props<{ playing: boolean}>());
reducers
是用来执行 actions
中的动作createReducer
方法导出createReducer
const reducer = createReducer(initialState, on(动作一),on(动作二), .....); // on执行一系列在actions中定义的动作
//执行 SetPlaying 这个动作之后,修改state数据,返回一个新的state状态,这样就不会和引用类型的冲突
on(SetPlaying, (state, {playing}) => ({ ...state, playing})),
//下面的这个会在xxx.module.ts文件中import export function playerReducer(state: PlayState, action: Action){ return reducer(state, action); }
### 5.0 `selectors`
- 拿到 state 里的所有的数据
- 通过`createSelector`方法创建
```ts
// 第二个参数是一个函数,获取playing数据的selector
export const getPlaying = createSelector(selectPlayerStates, (state: PlayState) => state.playing);
xxx.module.ts
imports: [
// CommonModule,
//https://next.ngrx.io/guide/store/configuration/runtime-checks#configuring-runtime-checks
StoreModule.forRoot({ player: playerReducer}, {
//检测这些操作是否合法
runtimeChecks: {
strictStateImmutability: true,
strictActionImmutability: true,
strictStateSerializability: true,
strictActionSerializability: true,
},
}),
]
export XXXModule{ }
在最终组件的模块中导入 XXXModule
在最终组件中使用 actions
或者selectors
中的方法,拿到数据
在一些组件中使用actions
中的setxxx
方法来设定
consturctor(private store$: Store<AppStoreModule>, ){}
onPlay(){
this.store$.dispatch(SetPlayList({ playList: trueList}))
}
上面这些代码执行之后,reducer中的InitialState的值就发生了变化,这个变化在 Redux插件中可以看到
在一些组件中使用selectors
中的getxxx
方法来拿数据,监听变化
consturctor(private store$: Store<AppStoreModule>, ){
appStore$
.pipe(select(getPlayList))
.subscribe((list) => this.watchList(list, "playList"));}
NgRx
Courses
前五分钟解释 大概的使用流程 https://www.bilibili.com/video/BV1iJ411F7Bf?p=22
NGRX课程 https://www.bilibili.com/video/BV1nt4y127iP?p=3
简介 https://hijiangtao.github.io/2020/05/08/Angular-State-Management-Invest-Report/