Maison > Article > interface Web > Le gestionnaire d'état front-end que vous devez maîtriser
La colonne
Avec l'utilisation généralisée de frameworks asynchrones tels que React et Vue, front- état final Les managers sont progressivement devenus un sujet incontournable du développement front-end. Par exemple, React a le populaire Redux, et un autre exemple est le gestionnaire d'état standard de Vue Vuex, qui sont tous deux relativement mature dans l'industrie, nous utiliserons alors du javascript natif pour implémenter un gestionnaire d'état.
comprend principalement deux aspects : le premier est la publier et s'abonner, et le second est la gestion de l'état.
Nous créons d'abord une fonction de classe PubSub :
class PubSub { constructor() { // 收集事件 this.events = {}; } }复制代码
Ensuite nous implémentons une fonction de publication :
class PubSub { ... // 发布 publish(event, data = {}) { const self = this; /* * 校验是否存在事件 * 默认返回一个空数组 */ if (!self.events.hasOwnProperty(event)) { return []; } // 遍历执行事件队列里的回调函数 return self.events[event].map((callback) => callback(data)); } ... }复制代码
Après avoir implémenté la fonction de publication publish, puis nous implémentons la fonction d'abonnement :
class PubSub { ... // 订阅 subscribe(event, callback) { const self = this; /* * 校验是否存在事件 * 默认给一个空数组 */ if (!self.events.hasOwnProperty(event)) { self.events[event] = []; } // 将事件推入回调队列 return self.events[event].push(callback); } ... }复制代码
class PubSub { constructor() { // 收集事件 this.events = {}; } // 订阅 subscribe(event, callback) { const self = this; /* * 校验是否存在事件 * 默认给一个空数组 */ if (!self.events.hasOwnProperty(event)) { self.events[event] = []; } // 将事件推入回调队列 return self.events[event].push(callback); } // 发布 publish(event, data = {}) { const self = this; /* * 校验是否存在事件 * 默认返回一个空数组 */ if (!self.events.hasOwnProperty(event)) { return []; } // 遍历执行事件队列里的回调函数 return self.events[event].map((callback) => callback(data)); } }复制代码
Nous créons d'abord un StoreFonction de classe :
class Store { // 传入params对象 constructor(params) { const self = this; self.actions = {}; // 异步任务对象 self.mutations = {}; // 同步任务对象 self.state = {}; // 全局状态对象 self.plugins = []; // 插件 self.status = "resting"; // 初始状态 /* * 初始化设置actions对象 * 该对象主要处理异步事件 */ if (params.hasOwnProperty("actions")) { self.actions = params.actions; } /* * 初始化设置mutations对象 * 该对象主要处理同步事件 */ if (params.hasOwnProperty("mutations")) { self.mutations = params.mutations; } // 插件 if (params.hasOwnProperty("plugins")) { self.plugins = params.plugins; } /* * 代理监听state */ self.state = new Proxy(params.state || {}, { set(state, key, value) { // 代理设置state对象并赋值 state[key] = value; // 更改状态 self.status = "resting"; return true; }, }); } }复制代码
Ensuite, nous implémentons la fonction principale commit, qui gère principalement les modifications d'objet et appelle les mutations au sein de l'objet Fonction :
class Store { ... commit = (mutationKey, payload) => { const self = this; // 校验是否存在函数 if (typeof self.mutations[mutationKey] !== "function") { console.warn(`Mutation ${mutationKey} dose not exist`); return false; } // 变更状态 self.status = "mutation"; // 执行对应函数 self.mutations[mutationKey](self.state, payload); return true; }; ... }复制代码
Après avoir implémenté commit, implémentons dispatch Cette fonction gère principalement les problèmes asynchrones, passons commit. Méthode :
class Store { ... dispatch = (actionKey, payload) => { const self = this; // 校验是否存在函数 if (typeof self.actions[actionKey] !== "function") { console.warn(`Action ${actionKey} dose not exist`); return false; } // 变更状态 self.status = "action"; // 执行对应函数,并传入commit self.actions[actionKey]({ commit: self.commit }, payload); return true; }; ... }复制代码
class Store { // 传入params对象 constructor(params) { const self = this; self.actions = {}; // 异步任务对象 self.mutations = {}; // 同步任务对象 self.state = {}; // 全局状态对象 self.plugins = []; // 插件 self.status = "resting"; // 初始状态 /* * 初始化设置actions对象 * 该对象主要处理异步事件 */ if (params.hasOwnProperty("actions")) { self.actions = params.actions; } /* * 初始化设置mutations对象 * 该对象主要处理同步事件 */ if (params.hasOwnProperty("mutations")) { self.mutations = params.mutations; } // 插件 if (params.hasOwnProperty("plugins")) { self.plugins = params.plugins; } /* * 代理监听state */ self.state = new Proxy(params.state || {}, { set(state, key, value) { // 代理设置state对象并赋值 state[key] = value; // 更改状态 self.status = "resting"; return true; }, }); } dispatch = (actionKey, payload) => { const self = this; // 校验是否存在函数 if (typeof self.actions[actionKey] !== "function") { console.warn(`Action ${actionKey} dose not exist`); return false; } // 变更状态 self.status = "action"; // 执行对应函数,并传入commit self.actions[actionKey]({ commit: self.commit }, payload); return true; } commit = (mutationKey, payload) => { const self = this; // 校验是否存在函数 if (typeof self.mutations[mutationKey] !== "function") { console.warn(`Mutation ${mutationKey} dose not exist`); return false; } // 变更状态 self.status = "mutation"; // 执行对应函数 self.mutations[mutationKey](self.state, payload); return true; } }复制代码
const SubPub = require("../lib/pubsub"); // 在state的代理中监测到数据改变,发布相对应事件 class Store { constructor(params) { // 实例化发布订阅 self.events = new SubPub() ... /* * 代理监听state */ self.state = new Proxy(params.state || {}, { set(state, key, value) { // 代理设置state对象并赋值 state[key] = value; // 添加发布事件 self.events.publish("stateChange", self.state); // 更改状态 self.status = "resting"; return true; }, }); ... } }复制代码
const Store = new Store({ state: { text: '' }, mutations: { init: (state, payload) => { state.text = payload }, }, actions: { init: ({commit},payload) => { setTimeout(() => { commit('init', payload) },200) } }, plugins: [ function() { console.log('plugins') } ] })// 执行同步事件Store.commit('init', 'hello init')// 执行异步事件Store.dispatch('init', 'hello async init')复制代码
Ce qui précède est la version de base du gestionnaire d'état global, comprenant le traitement synchrone et asynchrone de base, les plug-ins, les fonctions de publication et d'abonnement, et bien sûr, certains détails doivent être améliorés. Si vous avez des questions, n'hésitez pas à les signaler dans les commentaires, merci.
Recommandations d'apprentissage gratuites associées : javascript (vidéo)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!