redux篇--入门使用

192 阅读3分钟

记一次redux入门使用之路

前言...

最近公司项目告一段落,闲暇之余深感双手离开键盘的痛苦(快乐)。。准备找点其他的坑去入(让人知道你没闲着)。就开始了react之路。正好在练手的某个阶段,需要用到全局状态管理,总所周知vue有vuex,react搭配的时redux(没吃过猪肉,还是看过猪跑的),就去百度了redux的网址https://www.redux.org.cn/ 开始看,表示有可能第一次看我是有点蛋疼的,总是没能正确用起来,后面理解了。就记录下这次经历,希望能帮到其他人,也给自己留个记录!

需求

项目里面有一个全局通用的音频播放组件,需要在每个页面共享。

正文

首先我们心中会有一个大概的布局是这样的(根据vue的使用经验)

那么我们具体实现:

第一

首先播放器共享了3个状态:当前音乐播放信息,当前音乐播放地址,当前是否处于播放状态 ;
type.js
// 更新音乐播放地址
export const UPDATE_MUSIC_TYPE = 'UPDATE_MUSIC_PALYER'
reducer.js
import { UPDATE_MUSIC_TYPE } from "./types";
//新建一个reducer,用来更新/初始化store中的state

//初始播放器的共享状态
const playerDefault = {
    url : '',
    inof:{},
    play:false
}

//根据action动作改变store中的state,action内容下面有介绍,
//如果action.type未知(动作不明确),返回上一个状态下的state
export function updateMusicUrl(state = playerDefault,action){
    console.log(state,action)
    switch(action.type){
        case UPDATE_MUSIC_TYPE:
        return {
            ...action.data,
        }
        default:
        return state;    // 返回旧状态
    }
}

第二

初始化store,并暴露给外部

store.js
import { createStore } from "redux"
import { updateMusicUrl } from "./reducer"

//注册store,相当于初始化store中的state,并暴露给外布
let store = createStore(updateMusicUrl)
export default store;

下面是首次注册是调用的console结果,因为没有主动的action触发,所以返回的是我们初始化的state 这里完美诠释上面提到的:(如果action.type未知(动作不明确),返回上一个状态下的state)

第三

ok,现在写一个action来触发更新store的状态,因为redux刷新会重置store中的状态为初始状态,所以这里搭配使用sessionStorage

action.js

import { UPDATE_MUSIC_TYPE } from "./types";

//申明对谁动作,由type定义,且是必须,附带需要更新的数据

export function musicAction(data){
    window.sessionStorage.setItem('url',data.url)
    window.sessionStorage.setItem('paly',true)
    window.sessionStorage.setItem('info',JSON.stringify(data.info))
    return{
        type:UPDATE_MUSIC_TYPE,
        data:data
    }
}

第四

页面应用redux,触发修改

list.js

import store from "../../store/store";
import { musicAction } from "../../store/action";
/**
     * 播放音乐-获取音乐播放地址
     * @param {*} musicInfo :歌曲id
     * @param {*} j :歌曲索引
     */
    playMusic(musicInfo,j){
        console.log(musicInfo,j)
        // 获取歌曲播放地址
        httpRequest('GET','/song/url',{id:musicInfo.id})
        .then(res =>{
            console.log(res)
            let data = res.data;
            this.setState({
                songsUrl : data.data[0].url,
                activeIndex : j
            })
            let musicOpt = {
                info:musicInfo,
                url : data.data[0].url,
                play:true
            }
            store.dispatch(musicAction(musicOpt))
        })
    }
获取数据,同时监听state变化
```
player.js

import store from "../../store/store";

/**
 * 音乐播放器组件
 */
class Player extends React.Component{
    constructor(props){
        super(props)
        // 缓存最后一次播放的曲目信息
        const _songUrl = window.sessionStorage.getItem('url');
        const _songInfo = window.sessionStorage.getItem('info');
        const _isPlay = window.sessionStorage.getItem('play') ? window.sessionStorage.getItem('play') : false;
        this.state = {
            url:_songUrl ? _songUrl : '',
            info:JSON.parse(_songInfo) ? JSON.parse(_songInfo) : {},
            play:_isPlay,
            process:0
        }
        this.watchMusicUpdate()
        this.playMusic = this.playMusic.bind(this)
    }
    /**
     * 监听播放器音乐及曲目变化
     */
    watchMusicUpdate(){
        // 监听state状态改变
        store.subscribe(() => {
            const states = store.getState();
            console.log(states)
            this.setState({
                url : states.url,
                info: states.info,
                play:states.play,
            })
            if (this.state.url) {
                // 播放背景音乐
                this.refs.audio1.play()
                // 监听音乐播放进度
                this.watchMusicProcess(this.refs.audio1)
            }
            else {
                console.log('获取歌曲失败')
                // 暂停背景音乐
                this.refs.audio1.pause()
            }
        })
    }
```
写下这篇文章是由于那天真的很蒙蔽,一直没能理解action,action函数,reducer函数的作用,估计是没看清楚文档文字也有可能,今天再翻了一此文档,有感而发,匆匆记录一下自己的浅显理解。希望对别人能有帮助,哈哈 !(其实总结一句话,文档的大纲顺序怪怪的,先介绍action,再是store,再是reducer,没能很好的串在一起)