vuex如何存储数据、获取数据、以及数据的持久化

前提必须已经在vue中安装了vuex插件不然无法使用,不知道怎么创建vue和安装vuex的可以看这个视频,node.js版本最好16以上不然可能会安装失败:30分钟学会Vue之VueRouter&Vuex 趁着暑假掌握一门技能 大学生前端实习毕业设计必备技能_哔哩哔哩_bilibili

1、存储数据:(源码会放在最后)

第一步,在vuex中matations模块中加入存储数据的方法

第二步,在需要提交数据的页面使用this.$store.dispatch方法

通过点击事件submitForm即可将数据传入vuex中。点击跳转到About页面

2、获取数据

在点击跳转的另外一个页面使用this.$store.state.xxx即可获取vuex中数据状态

运行效果:

3、持久化

当我们页面刷新的时候vuex会丢失之前获取的数据,如果想刷新后一直保存数据,我们可以安装插件vuex-persistedstate,

安装指令:

复制代码
npm install vuex-persistedstate

提醒:必须使用管理员身份运行cmd终端不然可能会因为权限不够导致安装失败

安装成功后按这个模版来书写:

按照这个模版就可以存储state模块中的所有数据了。

运行效果:

源码:

登录页面:

复制代码
<template>
  <div class="home">
    <div class="samsung">
      <el-form :model="ruleForm" status-icon :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
        <el-form-item label="账号" prop="pass">
          <el-input  v-model="ruleForm.user" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="密码" prop="pass">
          <el-input type="password" v-model="ruleForm.pass" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="确认密码" prop="checkPass">
          <el-input type="password" v-model="ruleForm.checkPass" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="年龄" prop="age">
          <el-input v-model.number="ruleForm.age"></el-input>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="submitForm('ruleForm')"  v-loading.fullscreen.lock="fullscreenLoading">提交</el-button>
        </el-form-item>
      </el-form>
    </div>
    <!-- <HelloWorld></HelloWorld> -->
  </div>
</template>

<script>
export default {
  data () {
    const checkAge = (rule, value, callback) => {
      if (!value) {
        return callback(new Error('年龄不能为空'))
      }
      setTimeout(() => {
        if (!Number.isInteger(value)) {
          callback(new Error('请输入数字值'))
        } else {
          if (value < 18) {
            callback(new Error('必须年满18岁'))
          } else {
            callback()
          }
        }
      }, 1000)
    }
    const validatePass = (rule, value, callback) => {
      if (value === '') {
        callback(new Error('请输入密码'))
      } else {
        if (this.ruleForm.checkPass !== '') {
          this.$refs.ruleForm.validateField('checkPass')
        }
        callback()
      }
    }
    const validatePass2 = (rule, value, callback) => {
      if (value === '') {
        callback(new Error('请再次输入密码'))
      } else if (value !== this.ruleForm.pass) {
        callback(new Error('两次输入密码不一致!'))
      } else {
        callback()
      }
    }
    return {
      fullscreenLoading: false,
      ruleForm: {
        pass: '',
        checkPass: '',
        age: '',
        user: ''
      },
      rules: {
        pass: [
          { validator: validatePass, trigger: 'blur' }
        ],
        checkPass: [
          { validator: validatePass2, trigger: 'blur' }
        ],
        age: [
          { validator: checkAge, trigger: 'blur' }
        ]
      }
    }
  },
  methods: {
    submitForm (formName) {
      this.$refs[formName].validate((valid) => {
        if (valid) {
          // alert('submit!')
          const loading = this.$loading({
            lock: true,
            text: '登录中',
            spinner: 'el-icon-loading',
            background: 'rgba(0, 0, 0, 0.7)'
          })
          setTimeout(() => {
            const user = this.ruleForm.user
            const pass = this.ruleForm.pass
            const age = this.ruleForm.age
            this.$store.dispatch('setUser', user)
            this.$store.dispatch('setPass', pass)
            this.$store.dispatch('setAge', age)
            loading.close()
            console.log('登录成功')
            this.$router.push('/about')
          }, 2000)
        } else {
          console.log('error submit!!')
          return false
        }
      })
    },
    resetForm (formName) {
      this.$refs[formName].resetFields()
    }
  }
}
</script>

<style scoped>
  .home {
    display: flex;
    justify-content: center;
    align-items: center;
  }

  .samsung {
    width: 500px;
    height: 500px;
    display: flex;
    justify-content: center;
    align-items: center;
  }

  .denglu{
    display: flex;
    justify-content: center;
    align-items: center;
    width: 267px;
    height: auto;
  }
</style>

获取数据的页面:

复制代码
<template>
  <div class="about">
    <h1>This is an about page</h1>
    <h1>{{user}}</h1>
    <h1>{{pass}}</h1>
    <h1>{{age}}</h1>
  </div>
</template>
<script>
export default {
  data () {
    return {
      user: '',
      pass: '',
      age: 0
    }
  },
  created () {
    this.type()
  },
  methods: {
    type () {
      this.user = this.$store.state.user
      this.pass = this.$store.state.pass
      this.age = this.$store.state.age
      console.log('1', this.user)
      console.log('2', this.pass)
      console.log('3', this.age)
    }
  }
}
</script>

vuex:

复制代码
import Vue from 'vue'
import Vuex from 'vuex'
import createPersistedState from 'vuex-persistedstate'
Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    user: '',
    pass: '',
    age: 0
  },
  getters: {
  },
  mutations: {
    SET_PASS (state, pass) {
      state.pass = pass
    },
    SET_USER (state, user) {
      state.user = user
    },
    SET_AGE (state, age) {
      state.age = age
    }
  },
  actions: {
    setUser ({ commit }, user) {
      commit('SET_USER', user)
    },
    setPass ({ commit }, pass) {
      commit('SET_PASS', pass)
    },
    setAge ({ commit }, age) {
      commit('SET_AGE', age)
    }
  },
  modules: {
  },
  plugins: [
    createPersistedState({
      // 存储方式:localStorage、sessionStorage、cookies
      storage: window.sessionStorage,
      // 存储的 key 的key值
      key: 'store',
      reducer (state) { // render错误修改
        // 要存储的数据:本项目采用es6扩展运算符的方式存储了state中所有的数据
        return { ...state }
      }
    })
  ]

})
相关推荐
To_OC1 小时前
别再串行写 await 了,Promise.all 才是并行请求的正确打开方式
前端·javascript·promise
vipbic1 小时前
中后台越做越乱后,我用插件化把它救回来了
前端·vue.js
Hyyy2 小时前
Computer Use 适合做什么,不适合做什么——一次真实使用后的思考
前端
小和尚同志2 小时前
前端 AI 单元测试思考与落地
前端·人工智能·aigc
invicinble3 小时前
c端系统,其实更像一个信息展示平台
前端
李姆斯4 小时前
管理是否可以被完全量化
前端·产品经理·团队管理
名字还没想好☜5 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js
广州灵眸科技有限公司5 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能
江华森5 小时前
Web 开发基础:HTTP 与 REST
前端·网络协议·http
IT_陈寒6 小时前
Redis的KEYS命令把我搞崩溃了,改用SCAN才活过来
前端·人工智能·后端