本文详细介绍了Vue3的基础概念和关键知识点,包括安装与环境搭建、项目结构、组件化开发以及响应式系统。文章还深入讲解了Vue3的生命周期钩子、路由与状态管理,并通过实战案例展示了Vue3在实际项目中的应用。全文围绕vue3 考点展开,助力开发者全面掌握Vue3的核心技能。
Vue.js 是一个用于构建用户界面的渐进式框架。Vue3 是 Vue.js 的最新版本,它在性能、API、TypeScript 集成等方面都做了很多改进和更新。Vue3 通过引入 Composition API 和改进的响应式系统,大大提升了开发效率和代码的可维护性。
Vue3 安装与环境搭建安装 Vue3 需要 Node.js 环境。可以通过 npm 或者 yarn 来安装 Vue CLI(Command Line Interface),然后使用 Vue CLI 创建一个新的 Vue3 项目。以下是具体的安装步骤:
- 安装 Vue CLI:
npm install -g @vue/cli - 创建一个新的 Vue3 项目:
vue create my-vue3-project - 安装 Vue Router:
npm install vue-router@next - 安装 Vuex:
npm install vuex@next - 切换到项目目录并启动开发服务器:
cd my-vue3-project npm run serve 
一个典型的 Vue3 项目结构如下:
my-vue3-project/
├── node_modules/
├── public/
│   ├── index.html
│   └── favicon.ico
├── src/
│   ├── assets/
│   ├── components/
│   ├── App.vue
│   ├── main.js
│   └── router/
│       └── index.js
├── .browserslistrc
├── .editorconfig
├── .eslintrc.js
├── .gitignore
├── babel.config.js
├── package.json
├── README.md
└── vue.config.js
主要文件和目录说明
public/:存放静态文件,比如index.html和favicon.ico。src/:存放源代码,包括组件、样式、脚本等。App.vue:应用的主组件。main.js:应用的入口文件。router/:存放路由配置。package.json:项目依赖的配置文件。vue.config.js:Vue CLI 的配置文件。
在 Vue3 中,组件是构建应用的基本单元。每个组件都是一个独立的单元,有自己的模板、数据和逻辑。
创建组件
创建组件的基本步骤如下:
- 使用 
defineComponent定义组件:import { defineComponent, ref } from 'vue'; 
export default defineComponent({
name: 'HelloWorld',
props: {
msg: String,
},
setup(props) {
return () => <h1>{ props.msg }</h1>;
},
});
2. 在其他组件中使用该组件:
```html
<template>
  <h1>Parent Component</h1>
  <HelloWorld msg="Hello Vue3!" />
</template>
<script>
import HelloWorld from './components/HelloWorld.vue';
export default defineComponent({
  components: {
    HelloWorld,
  },
});
</script>
 props 和事件绑定
在 Vue3 中,可以通过 props 传值给子组件,也可以通过事件绑定实现父子组件间的通信。
使用 Props
import { defineComponent } from 'vue';
export default defineComponent({
  props: {
    msg: String,
  },
  setup(props) {
    return () => <h1>{ props.msg }</h1>;
  },
});
// ParentComponent.vue
<template>
  <h1>Parent Component</h1>
  <HelloWorld msg="Hello Vue3!" />
</template>
<script>
import HelloWorld from './components/HelloWorld.vue';
export default defineComponent({
  components: {
    HelloWorld,
  },
});
</script>
事件绑定
可以通过 v-on 指令来绑定事件:
<template>
  <h1>Parent Component</h1>
  <button v-on:click="onClick">Click me</button>
</template>
<script>
export default defineComponent({
  setup() {
    const onClick = () => {
      console.log('Button clicked!');
    };
    return { onClick };
  },
});
</script>
 插槽 (slot) 使用
插槽允许组件在其模板的特定位置插入内容。这使得组件可以更具灵活性和可重用性。
定义插槽
import { defineComponent } from 'vue';
export default defineComponent({
  name: 'MyComponent',
  props: {
    title: String,
  },
  setup(props) {
    return () => (
      <div>
        <h1>My Component</h1>
        <p>{ props.title }</p>
        <slot></slot>
      </div>
    );
  },
});
使用插槽
<template>
  <MyComponent title="Hello from Parent">
    <p>This is some additional content.</p>
  </MyComponent>
</template>
<script>
import MyComponent from './components/MyComponent.vue';
export default defineComponent({
  components: {
    MyComponent,
  },
});
</script>
 Vue3 响应式系统
 响应式原理介绍
Vue3 的响应式系统基于代理(Proxy)和反射(Reflect),通过读取和设置属性来触发相应的更新。Vue3 使用了一个称为 Proxy 的对象来监听数据的变化,当数据发生变化时,Vue3 会自动重新渲染组件。
在 Vue3 中,可以使用 ref 和 reactive 来定义响应式数据。
使用 ref
ref 用来创建一个响应式引用,适用于基本类型值:
import { defineComponent, ref } from 'vue';
export default defineComponent({
  setup() {
    const count = ref(0);
    const increment = () => {
      count.value++;
    };
    return { count, increment };
  },
});
使用 reactive
reactive 用来创建一个响应式对象,适用于复杂类型(如对象和数组):
import { defineComponent, reactive } from 'vue';
export default defineComponent({
  setup() {
    const state = reactive({
      count: 0,
    });
    const increment = () => {
      state.count++;
    };
    return { state, increment };
  },
});
 Ref 和 Reactive 的区别与联系
ref用于基本类型值,reactive用于复杂类型值。ref的值是通过ref.value来访问,而reactive的值可以直接访问。ref和reactive都是响应式的,当值发生变化时,会自动重新渲染组件。
Vue3 的生命周期钩子提供了在组件不同生命周期阶段执行代码的能力。这些钩子包括创建、挂载、更新、销毁等阶段。
生命周期钩子的使用场景生命周期钩子可以用来执行初始化、数据加载、组件销毁等任务。例如,在 mounted 钩子中可以执行一些 DOM 操作或异步数据加载。
常用生命周期钩子
beforeCreate:实例初始化之前created:实例初始化完成beforeMount:挂载开始之前mounted:挂载完成beforeUpdate:更新开始之前updated:更新完成beforeUnmount:卸载开始之前unmounted:卸载完成
beforeCreate:此时组件实例尚未初始化,this还没有指向实例。created:此时组件实例已经初始化,可以访问this,但 DOM 尚未挂载。beforeMount:此时组件实例已经初始化,但 DOM 尚未挂载。mounted:此时 DOM 已经挂载,可以访问this.$el。beforeUpdate:组件更新开始之前,可以访问this,但 DOM 尚未更新。updated:组件更新完成,可以访问this.$el。beforeUnmount:组件卸载开始之前,可以访问this,但 DOM 尚未卸载。unmounted:组件卸载完成。
Vue3 通常使用 Vue Router 来管理路由。以下是安装和配置 Vue Router 的步骤:
- 安装 Vue Router:
npm install vue-router@next - 创建路由配置文件:
// 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;
3. 在 `main.js` 中引入路由:
```javascript
import { createApp } from 'vue';
import router from './router';
import App from './App.vue';
createApp(App).use(router).mount('#app');
 状态管理库 Vuex 的应用
Vuex 是一个用于 Vue 应用的状态管理库。它可以集中管理应用的状态,方便状态的共享和复用。
安装 Vuex
npm install vuex@next
配置 Vuex
// store/index.js
import { createStore } from 'vuex';
export default createStore({
  state: {
    count: 0,
  },
  mutations: {
    increment(state) {
      state.count++;
    },
  },
  actions: {
    increment(context) {
      context.commit('increment');
    },
  },
  getters: {
    count: (state) => state.count,
  },
});
在 main.js 中引入 Vuex:
import { createApp } from 'vue';
import router from './router';
import store from './store';
import App from './App.vue';
createApp(App).use(router).use(store).mount('#app');
使用 Vuex
<template>
  <h1>Counter: {{ count }}</h1>
  <button @click="increment">Increment</button>
</template>
<script>
import { computed, inject } from 'vue';
export default defineComponent({
  setup() {
    const store = inject('store');
    const count = computed(() => store.state.count);
    const increment = () => store.dispatch('increment');
    return { count, increment };
  },
});
</script>
 路由与 Vuex 的结合使用
当使用路由和 Vuex 时,可以在路由的导航守卫中使用 Vuex 的状态来控制导航行为。
使用路由守卫
// router/index.js
import { createRouter, createWebHistory } from 'vue-router';
import store from '../store';
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,
});
router.beforeEach((to, from, next) => {
  if (to.path === '/about') {
    if (store.state.count < 10) {
      next('/home');
    } else {
      next();
    }
  } else {
    next();
  }
});
export default router;
 Vue3 实战应用
 Vue3 项目开发流程
Vue3 项目的开发流程一般包括以下几个步骤:
- 需求分析:明确项目目标和需求。
 - 设计:设计应用的结构和界面。
 - 环境搭建:安装必要的工具和库。
 - 编码:编写组件、路由、状态管理等。
 - 测试:进行单元测试、集成测试和用户测试。
 - 部署:将应用部署到生产环境。
 
在开发过程中经常会遇到一些常见问题,以下是一些调试技巧:
- 检查控制台输出:通过浏览器的开发者工具查看控制台输出,找到错误信息。
 - 使用 Vuex Devtools:安装 Vuex Devtools 可以方便地查看和修改 Vuex 的状态。
 - 使用 Vue Devtools:通过 Vue Devtools 可以查看组件的结构、状态和生命周期钩子的调用。
 - 断点调试:在代码中设置断点,逐步执行代码来跟踪问题。
 - 日志输出:通过 
console.log输出变量的值来调试代码。 
假设我们需要开发一个简单的购物车应用,包括商品列表、商品详情和购物车页面。以下是项目的主要部分:
商品列表
商品列表页面展示所有商品的信息,每个商品包含图片、名称和价格。
<template>
  <div>
    <h1>Product List</h1>
    <ul>
      <li v-for="product in products" :key="product.id">
        <img :class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="product.image" alt="Product Image" />
        <h2>{{ product.name }}</h2>
        <p>{{ product.price }}</p>
        <button @click="addToCart(product)">Add to Cart</button>
      </li>
    </ul>
  </div>
</template>
<script>
import { reactive, toRefs } from 'vue';
export default defineComponent({
  setup() {
    const state = reactive({
      products: [
        { id: 1, name: 'Product 1', price: '$10', image: 'image1.jpg' },
        { id: 2, name: 'Product 2', price: '$20', image: 'image2.jpg' },
      ],
    });
    const addToCart = (product) => {
      console.log(`Adding ${product.name} to cart.`);
    };
    return { ...toRefs(state), addToCart };
  },
});
</script>
商品详情
商品详情页面展示某个商品的详细信息,包括描述、规格和评论。
<template>
  <div>
    <h1>{{ product.name }}</h1>
    <img :class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="product.image" alt="Product Image" />
    <p>{{ product.description }}</p>
    <p>{{ product.specifications }}</p>
  </div>
</template>
<script>
import { defineComponent, computed, inject } from 'vue';
export default defineComponent({
  props: ['id'],
  setup(props) {
    const products = inject('products');
    const product = computed(() => {
      return products.find((p) => p.id === props.id);
    });
    return { product };
  },
});
</script>
购物车页面
购物车页面展示已添加到购物车的商品列表,用户可以修改数量和删除商品。
<template>
  <div>
    <h1>Cart</h1>
    <ul>
      <li v-for="item in cartItems" :key="item.id">
        <img :class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="item.image" alt="Product Image" />
        <h2>{{ item.name }}</h2>
        <p>{{ item.price }}</p>
        <input v-model.number="item.quantity" type="number" min="1" />
        <button @click="removeFromCart(item)">Remove</button>
      </li>
    </ul>
    <p>Total: {{ total }}</p>
  </div>
</template>
<script>
import { defineComponent, computed } from 'vue';
export default defineComponent({
  setup() {
    const cart = reactive({
      items: [],
    });
    const addToCart = (product) => {
      const existingItem = cart.items.find((item) => item.id === product.id);
      if (existingItem) {
        existingItem.quantity++;
      } else {
        cart.items.push({ ...product, quantity: 1 });
      }
    };
    const removeFromCart = (item) => {
      cart.items.splice(cart.items.indexOf(item), 1);
    };
    const total = computed(() => {
      return cart.items.reduce((total, item) => total + item.price * item.quantity, 0);
    });
    return { cart, addToCart, removeFromCart, total };
  },
});
</script>
路由配置
// router/index.js
import { createRouter, createWebHistory } from 'vue-router';
import ProductList from '../views/ProductList.vue';
import ProductDetail from '../views/ProductDetail.vue';
import Cart from '../views/Cart.vue';
const routes = [
  { path: '/', component: ProductList },
  { path: '/product/:id', component: ProductDetail },
  { path: '/cart', component: Cart },
];
const router = createRouter({
  history: createWebHistory(),
  routes,
});
export default router;
通过以上案例,可以看到 Vue3 的组件化开发、路由和状态管理的强大功能。希望这些示例能帮助你更好地理解和应用 Vue3。
共同学习,写下你的评论
评论加载中...
作者其他优质文章