MST

星途 面试题库

面试题:Vue计算属性依赖注入在模块化设计中的应用

在一个采用模块化设计的Vue项目里,不同模块可能有各自的计算属性和依赖注入需求。如何组织代码,确保依赖注入在模块间有效且清晰,同时保证计算属性的高效性?请阐述设计思路,并给出关键代码示例。
42.1万 热度难度
前端开发Vue

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. Vuex管理状态:使用Vuex来集中管理应用的状态,不同模块可以通过Vuex获取和修改共享状态,这样依赖注入更清晰和可控。模块之间的状态依赖通过Vuex的mutation和action来处理。
  2. Vue组件模块化:在Vue组件层面,将不同功能模块的组件独立封装,通过props和事件来进行父子组件间的通信。对于兄弟组件间通信,可以借助Vuex或者一个中央事件总线。
  3. 计算属性优化:对于计算属性,合理使用缓存机制。Vue的计算属性本身就有缓存,只有当它依赖的数据发生变化时才会重新计算。在设计计算属性时,确保依赖的数据粒度合适,避免不必要的重新计算。

关键代码示例

  1. Vuex模块定义
// store/modules/user.js
const state = {
  userInfo: null
}

const mutations = {
  SET_USER_INFO(state, info) {
    state.userInfo = info
  }
}

const actions = {
  fetchUserInfo({ commit }) {
    // 模拟异步请求获取用户信息
    setTimeout(() => {
      const userInfo = { name: 'John Doe', age: 30 }
      commit('SET_USER_INFO', userInfo)
    }, 1000)
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
  1. Vue组件使用Vuex状态和计算属性
<template>
  <div>
    <p v-if="userInfo">Name: {{ userInfo.name }}, Age: {{ userInfo.age }}</p>
    <button @click="fetchUserInfo">Fetch User Info</button>
  </div>
</template>

<script>
export default {
  computed: {
    userInfo() {
      return this.$store.state.user.userInfo
    }
  },
  methods: {
    fetchUserInfo() {
      this.$store.dispatch('user/fetchUserInfo')
    }
  }
}
</script>
  1. 组件间通过事件总线通信(可选,用于兄弟组件通信)
// eventBus.js
import Vue from 'vue'
export const eventBus = new Vue()
<!-- ComponentA.vue -->
<template>
  <button @click="sendMessage">Send Message</button>
</template>

<script>
import { eventBus } from './eventBus.js'
export default {
  methods: {
    sendMessage() {
      eventBus.$emit('message', 'Hello from ComponentA')
    }
  }
}
</script>
<!-- ComponentB.vue -->
<template>
  <div>{{ message }}</div>
</template>

<script>
import { eventBus } from './eventBus.js'
export default {
  data() {
    return {
      message: ''
    }
  },
  mounted() {
    eventBus.$on('message', (msg) => {
      this.message = msg
    })
  }
}
</script>