Maison > interface Web > js tutoriel > le corps du texte

Le gestionnaire d'état front-end que vous devez maîtriser

coldplay.xixi
Libérer: 2020-10-28 17:09:41
avant
2077 Les gens l'ont consulté

La colonne

javascript vous apprend à maîtriser le gestionnaire de statut front-end.

Le gestionnaire d'état front-end que vous devez maîtriser

State Manager

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.

Publier et s'abonnerPubSub

Créer une classe

Nous créons d'abord une fonction de classe PubSub :

class PubSub {  constructor() {  	// 收集事件
    this.events = {};
  }
}复制代码
Copier après la connexion

Implement Publish

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));
  }
  ...
}复制代码
Copier après la connexion

Implement Subscribe

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);
    }
    ...
}复制代码
Copier après la connexion

Code complet

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));
  }
}复制代码
Copier après la connexion

Gestion de l'étatStore

Créer une classe

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;
          },
        });
    }
}复制代码
Copier après la connexion

implémente commit

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;
    };
    ...
}复制代码
Copier après la connexion

implémente dispatch

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;
    };
    ...
}复制代码
Copier après la connexion

Code complet

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;
   }
}复制代码
Copier après la connexion

Combinaison PubSub et Store

Introduction de la bibliothèque PubSub

	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;
              },
            });
            ...
        }
    }复制代码
Copier après la connexion

Scénario d'instance

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')复制代码
Copier après la connexion

Résumé

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!

Étiquettes associées:
source:juejin.im
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!