资讯专栏INFORMATION COLUMN

vuex在重构Cnode项目中的运用

trilever / 2911人阅读

摘要:定义需要状态的参数变量,状态变更用于改变的状态,注意中是不能直接改变中的状态的,一定要借助于的事件分发。而在中进行事件的分发就可以进行异步操作。当然还有许多的地方可以用到,比如说在本项目的弹窗组件也用到了,来根据具体情境显示对应的提示文本。

写在文章前:

在第一版初步实现cnode的基本功能后,本来是用本地存储的存储用户登录成功返回的用户的基本信息,用于后面的回复功能,查看信息等操作需要的用户基本信息的数据。但是总的来说感觉本地储存的方案不太理想(个人想法),所以想引入vuex来存储用户信息,还有一些跨组件的状态和数据。

什么是vuex,干吗用的?

简单的介绍一下我理解的vuex是什么东西,因为我们知道vue的组件子父之间是可以同过props实现数据的单向和双向传递,但是我们可能经常遇到的业务场景是一个组件的状态发生改变需要在另一个与他不相关的组件进行响应,这个时候如果我们没做全局变量就没办法搞了,所以说vuex总的来说就是一个全局的状态管理。(我是这么认为的)

建议阅读文档

关于vuex的基本用法请参见中文API

在项目中使用vuex

现在直接上手实现一个功能把登录成功的用户信息保存在vuex中,这个功能是基于你看过文档并初步了解了vuex,知道state,mutation這些基本概念,由于API的文档中的例子只是个简单的demo,所以我写了这个功能更贴切一个项目中实际的场景。(这里就不介绍那些基础概念了,因为API肯定介绍得比我详细)

1.初始化

建立一个文件 store.js代码如下。state定义需要状态的参数变量,mutation(状态变更)用于改变state的状态,注意vuex中是不能直接改变state中的状态的,一定要借助于mutation的事件分发。mutation的方法可以第一个参数一定是state,后面也可以选择带参,两种本例子下面都有定义。

"use strict";
import Vue from "vue"
import Vuex from "vuex";
Vue.use(Vuex);
const state = {
     // 页面打开默认设置登录状态为否
     isLogin : false,
     // 保存登录信息
     userInfo : {
          "loginname" : "",
          "avatar" : "",
          "id" : "",
          "accesstoken" : ""
     }
}
const mutations = {
     // 设置登录
     ISLOGIN (state) {
          state.isLogin = true;
     },
     // 设置登录用户信息
     SETUSERINFO (state, name, avatar, id, accesstoken) {
          state.userInfo.loginname = name;
          console.log(state.userInfo.loginname);
          state.userInfo.avatar = avatar;
          state.userInfo.id = id;
          state.userInfo.accesstoken = accesstoken;
     }
}
export default new Vuex.Store({
     state,
     mutations
})
2.设置state状态

建立一个action.js代码如下,用于用户分发mutation的事件。可能有些人会疑惑为什么要多写这个文件来分发mutation的事件,是应为我们的mutation必须是同步执行,如果在mutation中进行回调,根本就无法确定到底什么时候能执行那个回调函数。而在action中进行事件的分发就可以进行异步操作。

/**
  *修改用户登录状态为已经登录
**/
export const isLogin = ({dispatch}) => {
     dispatch("ISLOGIN");
}
/**
  *设置用户的登录信息
  *参数 name用户名 avatar用户头像 id用户id accesstoken用户登录标识
**/
export const setUserInfo = ({dispatch}, name, avatar, id, accesstoken) => {
     dispatch("SETUSERINFO", name, avatar, id, accesstoken);
}
3.获取state状态

建立一个getters.js代码如下,用户用户获取state中的状态。

//获取用户的登录状态
export const getLoginState = (state) => {
     return state.isLogin;
}
//获取登录用户的信息
export const getUserInfo = (state) => {
     return state.userInfo;
}
4.在组件中调用vuex

这里注意一点在子父组件中调用vuex区别的一点是父组件一定要定义store:store,子组件随意。

import store from "../vuex/store";
import nvHeader from "../components/header.vue";
import {isLogin, setUserInfo} from "../vuex/actions";
export default {
          data : function(){
               return {
                    strToken : ""
               }
          },
          methods : {
               login : function() {
                    let rqdata = {
                         "accesstoken" : this.strToken
                    }

                    $.post("https://cnodejs.org/api/v1/accesstoken", rqdata, (data) => {
                         if(data){
                              // 登入成功改变isLogin的状态为true
                              this.userLogin();
                              console.log(this.userLoginState);
                              this.setUserInfo(data.loginname, data.avatar_url, data.id, this.strToken)
                              window.history.back();
                         }else{
                              // 失败
                         }
                    })
               }
          },
          components : {
               "nv-header" : nvHeader
          },
          store : store,
          vuex : {
               actions : {
                    userLogin : isLogin,
                    setUserInfo : setUserInfo
               }
          }
     }

我们在login.vue这个组件中调用了子组件header.vue这个组件,在header.vue组件中又调用了menu.vue这个组件,而在menu这个组件中有一块用户信息是我们登录了才会去显示当前登录用户的基本信息,这就要从store中去获取状态啦,而我们之前登录成功应景对store的状态进行了更新,menu.vue中应该自动响应,把用户信息展示出来



结束语:

ok,这个登录显示用户信息的基本功能就实现了。当然还有许多的地方可以用到vuex,比如说在本项目的弹窗组件也用到了vuex,来根据具体情境显示对应的提示文本。本人重构的Cnode项目也在逐渐的完善,如果觉得本篇文章对你有收获可以star支持一下,谢谢!

github源码 线上demo访问地址

tip:线上demo在浏览器切换为移动端模式下访问效果更佳

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80272.html

相关文章

  • Vue.js项目重构,轻松实现上拉加载滚动位置还原

    摘要:这是基于进行状态管理的完整项目,包含了用户的登录退出,路由页面,滚动位置还原,帖子编辑状态保存等等,麻雀虽小,却是五脏俱全。 前言 上一篇《Vue.js轻松实现页面后退时,还原滚动位置》只是简单的实现了路由切换时进行的滚动位置还原,很多朋友就来问上拉加载怎么实现啊!于是我想起了以前做过一个叫vue-cnode的项目,于是花了两天时间进行了重构,完全的移除了Vuex,使用了Vuet来做为...

    junbaor 评论0 收藏0
  • 基于cnode社区API重写的Vue2.0项目(vue,vue-route,vuex,axios,w

    摘要:项目地址前言该项目是采用社区提供的,基于重写,在此特别感谢然后也要感谢的项目给予我的启发。 项目地址 https://github.com/LeeWgg/CNode DEMO http://www.leewgg.cn/projects... 前言 该项目是采用Cnode社区提供的api,基于vue2.0重写,在此特别感谢!!!然后也要感谢 https://github.com/shin...

    YPHP 评论0 收藏0
  • vue2.x-cnode(vue全家桶)

    摘要:后续会改成的版本安装安装编译语法使用编译语法图片路径与打包安装引入图片需要依赖的加载器样式引入打包文件编译打包引入样式文件编译 vue2.x-cnode 关于项目 vue2.x Cnode社区是基于vue、vue-router、vuex、axios、es6开发,使用webpack构建工具编译打包项目 如果此开源项目对大家学习vue的全家桶有帮助,请给我一个star,因为你的star让我...

    ThinkSNS 评论0 收藏0
  • vue练习之vue+cnode api

    摘要:最近使用社区提供的做了简单练习项目地址预览地址正好学会如何把项目部署到使用做简单动画效果,解析文本只做了简单的几个功能,所以没有用到,感觉小项目其实用不多。主要页面文件采用获取提交数据在先初始化获取帖子列表信息填充帖子列表 最近使用vue+cnode社区提供的api做了简单练习项目地址:https://github.com/joyhb/vueNode预览地址:https://joyhb...

    chaos_G 评论0 收藏0

发表评论

0条评论

trilever

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<