Vue组件数据管理和传输

1.组件之间的共享数据的方式大概有一下几种
(1)父向子传输:v-bind
(2)子向付传输:v-on
(3)兄弟组:EventBus
$on :接受组件
$emit:发送组件
以上为组件间传输,更加适用于小范围的数据传输

2.VueX整体管理组件
使用方法
(1)直接在组件内用{ $vuex.state.xxx} 来调用
(2)在vuex中导入mapstate函数
import{mapstate}from ‘vuex’
映射入组件的computed计算属性
computed:{mapstate[‘count’]}
(3)调用方法
1.Vuex只能通过mutation变更store数据不可直接操作
2.方便容易全局查找维护

下面贴一些使用样例

vuex->store.js

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);
// 登录验证
export default new Vuex.Store({
    state: {
        user: false
    },
    mutations: {
        // 登录
        login(state, user) {
            state.user = user;
            localStorage.setItem("userInfo", user);
        },
        // 退出
        logout(state, user) {
            state.user = "";
            localStorage.setItem("userInfo", "");
        }
    }
})

login.vue

<template>
  <div class="login-wrap">
    <el-form label-position="left" :model="ruleForm" :rules="rules" ref="ruleForm" label-width="0px" class="demo-ruleForm login-container">
      <h3 class="title">用户登录</h3>
      <el-form-item prop="username">
        <el-input type="text" v-model="ruleForm.username" auto-complete="off" placeholder="账号"></el-input>
      </el-form-item>
      <el-form-item prop="password">
        <el-input type="password" v-model="ruleForm.password" auto-complete="off" placeholder="密码"></el-input>
      </el-form-item>
      <el-row>
      </el-row>
      <el-checkbox class="remember" v-model="rememberpwd">记住密码</el-checkbox>
      <el-form-item style="width:100%;">
        <el-button type="primary" style="width:100%;" @click="submitForm('ruleForm')" :loading="logining">登录</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>
<script type="text/ecmascript-6">
import { login } from '../api/userMG'
import { setCookie, getCookie, delCookie } from '../utils/util'
import md5 from 'js-md5'
export default {
  name: 'login',
  data() {
    return {
      //定义loading默认为false
      logining: false,
      // 记住密码
      rememberpwd: false,
      ruleForm: {
        //username和password默认为空
        username: '456',
        password: '456',
      },
      //rules前端验证
      rules: {
        username: [{ required: true, message: '请输入账号', trigger: 'blur' }],
        password: [{ required: true, message: '请输入密码', trigger: 'blur' }]
      }
    }
  },
  // 创建完毕状态(里面是操作)
  created() {
    this.$message({
      message: '账号密码及验证码不为空即可',
      type: 'success'
    })
    // 获取图形验证码
    // this.getcode()
    // 获取存在本地的用户名密码
    this.getuserpwd()
    
  },
  // 里面的函数只有调用才会执行
  methods: {
    // 获取用户名密码
    getuserpwd() {
      if (getCookie('user') != '' && getCookie('pwd') != '') {
        this.ruleForm.username = getCookie('user')
        this.ruleForm.password = getCookie('pwd')
        this.rememberpwd = true
      }
    },
    //获取info列表
    submitForm(formName) {
      this.$refs[formName].validate(valid => {
        if (valid) {
          console.log(this.ruleForm)
          // this.logining = true
          // 测试通道,不为空直接登录
          // setTimeout(() => {
          //   this.logining = false
          //   this.$store.commit('login', 'true')
          //   this.$router.push({ path: '/User/UserList' })
          // }, 1000)
          // 注释
          login(this.ruleForm).then(res => {
            if (res.success) {
              if (this.rememberpwd) {
                //保存帐号到cookie,有效期7天
                setCookie('user', this.ruleForm.username, 7)
                //保存密码到cookie,有效期7天
                setCookie('pwd', this.ruleForm.password, 7)
              } else {
                delCookie('user')
                delCookie('pwd')
              }
              //如果请求成功就让他2秒跳转路由
              setTimeout(() => {
                this.logining = false
                // 缓存token
                localStorage.setItem('logintoken', res.data.token)
                // 缓存用户个人信息
                localStorage.setItem('userdata', JSON.stringify(res.data))
                this.$store.commit('login', 'true')
                this.$router.push({ path: '/User/userList' })
              }, 1000)
            } else {
                console.log(res)
                  this.$message({
                    message: '账号密码错误',
                    type: 'error'
                  })
              this.logining = false
              return false
            }
          })
        } else {
          // 获取图形验证码
          this.getcode()
          this.$message.error('请输入用户名密码!')
          this.logining = false
          return false
        }
      })
    },
  }
}
</script>

### 实现 Vue3 异步组件间的数据传递 #### 使用 Props Watch 处理异步数据 在 Vue 3 中,父组件可以通过 `props` 将异步获取的数据传递给子组件。由于 props 的值是在组件实例创建初期被初始化并传递给子组件,在整个生命周期内,如果父组件中的 prop 数据发生变化,则会触发子组件的相应更新[^5]。 为了确保子组件能正确接收到最新的异步数据而不是初始值,可以在子组件内部监听特定属性的变化: ```javascript // 子组件 export default { props: ['asyncData'], watch: { asyncData(newVal, oldVal) { console.log('Async data updated:', newVal); // 对新接收的数据做进一步处理 } }, } ``` #### 利用 Vuex 进行全局状态管理 对于更复杂的应用场景,尤其是涉及多个组件共享同一份异步加载的数据时,推荐采用 Vuex 来集中管理分发应用的状态。Vuex 提供了一种结构化的方式来存储操作跨页面使用的公共变量或对象[^4]。 下面是一个简单的例子展示如何利用 Vuex 完成从服务器拉取列表信息并通过 action 更新 store 后再由各个依赖该 state 的组件自动刷新视图的过程: ```javascript // store/index.js import { createStore } from 'vuex'; const store = createStore({ state() { return { listItems: [] }; }, mutations: { SET_LIST_ITEMS(state, items) { state.listItems = items; } }, actions: { fetchList({ commit }) { axios.get('/api/items') .then(response => { const fetchedItems = response.data; commit('SET_LIST_ITEMS', fetchedItems); }) .catch(error => console.error(error)); } } }); export default store; // 父组件或其他任何地方调用action来发起请求 this.$store.dispatch('fetchList'); ``` 之后,在需要的地方可以直接访问 `$store.state.listItems` 或者通过计算属性简化读写逻辑。 #### 解决初次渲染时无法获得最新数据的问题 有时可能会遇到这样的情况:尽管已经成功设置了异步回调函数并将结果赋给了某个响应式的 property,但在首次挂载阶段仍然看不到预期的结果。这通常是因为此时 DOM 渲染发生在 Promise resolve 之前造成的延迟现象[^2]。 一种解决方案是让子组件等待直到它确实收到了有效负载后再执行某些操作;另一种办法则是借助于 Vue 生命周期钩子如 `mounted()` 配合条件渲染技术 (`v-if`) 来控制何时显示内容。 ```html <!-- 子组件模板 --> <template> <div v-if="loaded"> <!-- 只有当 loaded === true 才会被渲染出来 --> {{ processedData }} </div> </template> <script> export default { props: ['asyncData'], data() { return { loaded: false, processedData: null }; }, mounted() { this.processAndLoad(); }, methods: { processAndLoad() { setTimeout(() => { // 假设这里进行了必要的预处理... this.processedData = /* ... */; this.loaded = true; // 开启渲染开关 }, 0); // 模拟微任务队列效果 } } }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值