记录几个Vue3框架核心功能点,例如响应式数据reactive、组合式API setup、computed、组件通信、路由导航,状态管理vuex、pinia……等实战示例代码:
一、响应式数据(Reactive Data)
-
创建响应式对象
- 使用
reactive
函数创建一个响应式的对象。
import { reactive } from 'vue';const state = reactive({count: 0,message: 'Hello Vue3' });// 在组件中使用 export default {setup() {return { state };} };
- 在模板中可以直接使用
{{state.count}}
和{{state.message}}
来显示数据,并且当这些数据发生变化时,视图会自动更新。
- 使用
-
响应式数组操作
- 对于数组的操作,Vue3也能正确追踪变化。
const list = reactive([1, 2, 3]);function addItem() {list.push(list.length + 1); }
二、组合式API(Composition API) - setup函数
- 计算属性(Computed Properties)
- 计算属性基于响应式数据进行计算并缓存结果。
import { reactive, computed } from 'vue';const state = reactive({firstName: 'John',lastName: 'Doe' });const fullName = computed(() => `${state.firstName} ${state.lastName}`);export default {setup() {return { state, fullName };} };
- 生命周期钩子(Lifecycle Hooks)
- 在
setup
函数中使用生命周期钩子。
import { onMounted } from 'vue';export default {setup() {onMounted(() => {console.log('Component is mounted');});} };
- 在
三、组件通信
- 父子组件通信 - Props和Emit
- 父组件传递数据给子组件(Props)。
- 子组件发送事件给父组件(Emit)。
- 父组件:
<template><ChildComponent :message="parentMessage" @childEvent="handleChildEvent" /> </template><script> import { ref } from 'vue'; import ChildComponent from './ChildComponent.vue';export default {components: { ChildComponent },setup() {const parentMessage = ref('Hello from parent');const handleChildEvent = (data) => {console.log('Received from child:', data);};return { parentMessage, handleChildEvent };} }; </script>
- 子组件:
<template><button @click="sendToParent">Send to Parent</button> </template><script> import { defineComponent, toRefs } from 'vue';export default defineComponent({props: {message: String},setup(props, { emit }) {const { message } = toRefs(props);const sendToParent = () => {emit('childEvent', 'Hello from child');};return { sendToParent, message };} }); </script>
四、路由(Vue Router)集成(以下代码前提需要先安装配置好Vue Router)
- 定义路由和导航
- 在
router/index.js
中定义路由。
import { createRouter, createWebHistory } from 'vue-router'; import Home from '../views/Home.vue'; import About from '../views/About.vue';const routes = [{ path: '/', component: Home },{ path: '/about', component: About } ];const router = createRouter({history: createWebHistory(),routes });export default router;
- 在组件中进行导航。
<template><button @click="navigateToAbout">Go to About</button> </template><script> import { useRouter } from 'vue-router';export default {setup() {const router = useRouter();const navigateToAbout = () => {router.push('/about');};return { navigateToAbout };} }; </script>
- 在
五、状态管理工具 - Vuex与Pinia
在Vue3中,除了组件内部的状态管理,我们经常需要处理跨组件的共享状态。这时,我们可以使用Vuex或Pinia这样的状态管理工具。
- Vuex的使用
首先,安装Vuex:
npm install vuex@next --save
创建一个Vuex store:
// store/index.js
import { createStore } from 'vuex';export default createStore({state() {return {count: 0};},mutations: {increment(state) {state.count++;}},actions: {increment(context) {context.commit('increment');}},getters: {doubleCount(state) {return state.count * 2;}}
});
在主文件中引入并使用store:
// main.js
import { createApp } from 'vue';
import App from './App.vue';
import store from './store';const app = createApp(App);
app.use(store);
app.mount('#app');
在组件中使用Vuex:
<template><div><p>Count: {{ count }}</p><p>Double Count: {{ doubleCount }}</p><button @click="increment">Increment</button></div>
</template><script>
import { mapState, mapGetters, mapActions } from 'vuex';export default {computed: {...mapState(['count']),...mapGetters(['doubleCount'])},methods: {...mapActions(['increment'])}
};
</script>
- ** Pinia的使用**
Pinia是Vue的官方状态管理库,它更加轻量且与Vue3的组合式API完美集成。
首先,安装Pinia:
npm install pinia --save
创建一个Pinia store:
// stores/counter.js
import { defineStore } from 'pinia';export const useCounterStore = defineStore('counter', {state: () => ({count: 0}),actions: {increment() {this.count++;}},getters: {doubleCount: (state) => state.count * 2}
});
在主文件中引入并使用Pinia:
// main.js
import { createApp } from 'vue';
import App from './App.vue';
import { createPinia } from 'pinia';const app = createApp(App);
app.use(createPinia());
app.mount('#app');
在组件中使用Pinia:
<template><div><p>Count: {{ counter.count }}</p><p>Double Count: {{ counter.doubleCount }}</p><button @click="counter.increment">Increment</button></div>
</template><script>
import { useCounterStore } from '../stores/counter';export default {setup() {const counter = useCounterStore();return { counter };}
};
</script>