Vue.js 从入门到精通:全面解析组件化、路由与状态管理(附 Todo 案例)

news2024/10/25 4:17:05

在当今的前端开发领域,Vue.js 以其简洁、高效和灵活的特点受到了广泛的关注和应用。本文将带你从 Vue 的基础知识入手,逐步深入到高级特性,让你对 Vue 有一个全面的了解,并通过实际案例帮助你更好地掌握 Vue 的开发。

一、Vue 简介

Vue.js 是一个渐进式 JavaScript 框架,它专注于视图层,易于上手且非常灵活。Vue 的核心库只关注视图层,因此可以轻松地与其他库或现有项目集成。

二、环境搭建

  1. 安装 Node.js
    Vue.js 需要 Node.js 环境来运行。你可以从Node.js 官方网站下载并安装适合你操作系统的版本。

  2. 安装 Vue CLI
    Vue CLI 是一个官方提供的命令行工具,用于快速搭建 Vue 项目。打开终端并运行以下命令来安装 Vue CLI:

   npm install -g @vue/cli

三、创建第一个 Vue 项目

 1.使用 Vue CLI 创建项目
  在终端中运行以下命令来创建一个新的 Vue 项目:

   vue create my-vue-project

按照提示选择项目的配置选项,如使用 Vue 2 还是 Vue 3、是否安装路由和状态管理等。

2.项目结构
创建完成后,进入项目目录,可以看到以下主要的文件和目录:

  • src/:项目的源代码目录。
  • main.js:入口文件,用于创建 Vue 实例。
  • App.vue:根组件文件。
  • package.json:项目的配置文件。

四、Vue 的基本语法

1.模板语法
Vue 使用模板语法来将数据渲染到 HTML 中。以下是一个简单的例子:

   <template>
     <div>
       <h1>{{ message }}</h1>
     </div>
   </template>

   <script>
   export default {
     data() {
       return {
         message: 'Hello, Vue!'
       };
     }
   };
   </script>

在上面的例子中,使用双大括号{{ message }}来显示数据message的值。

2.指令
Vue 提供了一些指令来增强 HTML 的功能。例如,v-ifv-for指令:

   <template>
     <div>
       <ul>
         <li v-for="item in items" :key="item.id">{{ item.name }}</li>
       </ul>
       <p v-if="showMessage">This message is visible.</p>
     </div>
   </template>

   <script>
   export default {
     data() {
       return {
         items: [
           { id: 1, name: 'Item 1' },
           { id: 2, name: 'Item 2' },
           { id: 3, name: 'Item 3' }
         ],
         showMessage: true
       };
     }
   };
   </script>

在上面的例子中,使用v-for指令遍历items数组并渲染每个元素,使用v-if指令根据showMessage的值来决定是否显示<p>元素。

五、组件化开发

1.创建组件
Vue 鼓励使用组件化开发,将页面拆分成多个可复用的组件。以下是一个简单的组件示例:

   <template>
     <div>
       <h2>{{ title }}</h2>
       <p>{{ content }}</p>
     </div>
   </template>

   <script>
   export default {
     props: ['title', 'content'],
   };
   </script>

在上面的例子中,创建了一个名为MyComponent的组件,它接受titlecontent两个属性。

2.使用组件
在其他组件或页面中,可以使用<component-name>标签来引用组件,并通过属性传递数据:

   <template>
     <div>
       <MyComponent title="Component Title" content="Component content." />
     </div>
   </template>

   <script>
   import MyComponent from './MyComponent.vue';

   export default {
     components: {
       MyComponent
     }
   };
   </script>

组件化开发的优势在于提高代码的可维护性和可复用性。通过将页面拆分成多个小的组件,可以更好地组织代码,使得每个组件的功能更加单一,易于理解和修改。同时,组件可以在不同的页面或项目中复用,减少了重复代码的编写。

组件通信

在 Vue 中,组件之间的通信有多种方式:

1.Props 传递数据:父组件向子组件传递数据可以通过 props 属性。子组件通过接收父组件传递过来的 props 来获取数据。

   <!-- 父组件 -->
   <template>
     <div>
       <ChildComponent :message="parentMessage" />
     </div>
   </template>

   <script>
   import ChildComponent from './ChildComponent.vue';

   export default {
     data() {
       return {
         parentMessage: 'Hello from parent'
       };
     },
     components: {
       ChildComponent
     }
   };
   </script>

   <!-- 子组件 -->
   <template>
     <div>
       <p>{{ message }}</p>
     </div>
   </template>

   <script>
   export default {
     props: ['message']
   };
   </script>

2.触发事件:子组件向父组件传递数据可以通过触发自定义事件并使用emit` 方法。父组件在使用子组件时监听这个自定义事件来获取子组件传递过来的数据。

   <!-- 父组件 -->
   <template>
     <div>
       <ChildComponent @customEvent="handleCustomEvent" />
     </div>
   </template>

   <script>
   import ChildComponent from './ChildComponent.vue';

   export default {
     methods: {
       handleCustomEvent(data) {
         console.log(data);
       }
     },
     components: {
       ChildComponent
     }
   };
   </script>

   <!-- 子组件 -->
   <template>
     <div>
       <button @click="emitEvent">Emit Event</button>
     </div>
   </template>

   <script>
   export default {
     methods: {
       emitEvent() {
         this.$emit('customEvent', 'Data from child');
       }
     }
   };
   </script>

3.Vuex 状态管理:对于复杂的应用,多个组件之间需要共享数据时,可以使用 Vuex 进行状态管理。Vuex 提供了一个集中式的存储,使得组件可以方便地获取和修改共享状态。

六、路由管理

1.安装 Vue Router
Vue Router 是 Vue.js 的官方路由管理器。在项目中安装 Vue Router:

   npm install vue-router

2.配置路由
创建一个router.js文件来配置路由:

   import Vue from 'vue';
   import VueRouter from 'vue-router';
   import Home from './views/Home.vue';
   import About from './views/About.vue';

   Vue.use(VueRouter);

   const routes = [
     {
       path: '/',
       name: 'Home',
       component: Home
     },
     {
       path: '/about',
       name: 'About',
       component: About
     }
   ];

   const router = new VueRouter({
     mode: 'history',
     routes
   });

   export default router;

在上述代码中,首先导入VueVueRouter以及两个视图组件Home.vueAbout.vue。然后使用Vue.use(VueRouter)安装路由插件。接着定义了一个路由数组routes,其中每个对象代表一个路由,包括路径path、路由名称name和对应的组件component。最后,创建一个VueRouter实例并将其导出。

3.使用路由
main.js文件中引入路由并将其挂载到 Vue 实例上:

   import Vue from 'vue';
   import App from './App.vue';
   import router from './router';

   Vue.config.productionTip = false;

   new Vue({
     render: h => h(App),
     router
   }).$mount('#app');

在组件中,可以使用<router-link>标签来导航到不同的路由,使用<router-view>标签来显示当前路由对应的组件:

   <template>
     <div>
       <nav>
         <router-link to="/">Home</router-link>
         <router-link to="/about">About</router-link>
       </nav>
       <router-view></router-view>
     </div>
   </template>

<router-link>标签会生成一个链接,点击链接时会导航到对应的路由。<router-view>标签是一个占位符,用于显示当前路由对应的组件。

路由参数和查询参数

1.路由参数:可以在路由中定义参数,以便在不同的页面之间传递特定的值。例如:

   const routes = [
     {
       path: '/user/:id',
       name: 'User',
       component: User
     }
   ];

在组件中,可以通过this.$route.params.id来获取路由参数的值。

2.查询参数:可以在路由链接中添加查询参数,用于传递额外的信息。例如:

   <router-link :to="{ path: '/user', query: { id: 123 } }">User Page</router-link>

在组件中,可以通过this.$route.query.id来获取查询参数的值。

路由导航守卫

路由导航守卫可以在路由切换的不同阶段进行拦截和控制。主要有以下几种导航守卫:

1.全局前置守卫:在路由切换之前执行,可以用于判断用户是否登录等权限控制。

   router.beforeEach((to, from, next) => {
     // 判断用户是否登录
     if (to.meta.requiresAuth &&!isLoggedIn()) {
       next('/login');
     } else {
       next();
     }
   });

2.全局后置守卫:在路由切换之后执行,可以用于统计页面访问等操作。

   router.afterEach((to, from) => {
     // 统计页面访问
     trackPageView(to.fullPath);
   });

3.组件内守卫:可以在组件内定义beforeRouteEnterbeforeRouteUpdatebeforeRouteLeave守卫,分别在进入组件、路由参数变化和离开组件时执行。

   export default {
     beforeRouteEnter(to, from, next) {
       // 在进入组件之前执行
       next(vm => {
         // 可以访问组件实例 vm
       });
     },
     beforeRouteUpdate(to, from, next) {
       // 在路由参数变化时执行
       next();
     },
     beforeRouteLeave(to, from, next) {
       // 在离开组件之前执行
       next();
     }
   };

七、状态管理

 1.安装 Vuex
  Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。安装 Vuex:

   npm install vuex

  2.配置 Vuex
  创建一个store.js文件来配置 Vuex:

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

   Vue.use(Vuex);

   const store = new Vuex.Store({
     state: {
       count: 0
     },
     mutations: {
       increment(state) {
         state.count++;
       }
     },
     actions: {
       increment(context) {
         context.commit('increment');
       }
     },
     getters: {
       doubleCount(state) {
         return state.count * 2;
       }
     }
   });

   export default store;

       在上述代码中,首先导入VueVuex,然后使用Vue.use(Vuex)安装状态管理插件。接着创建一个Vuex.Store实例,其中包含状态state、 mutations、 actions 和 getters。

  • state:存储应用的状态数据。
  • mutations:定义了修改状态的方法,只能通过提交 mutation 来修改状态。
  • actions:用于处理异步操作,可以提交 mutation 来修改状态。
  • getters:可以从状态中派生出一些计算属性,方便在组件中使用。

3.使用 Vuex
在组件中,可以通过this.$store来访问 Vuex 状态和方法:

   <template>
     <div>
       <p>Count: {{ count }}</p>
       <p>Double Count: {{ doubleCount }}</p>
       <button @click="increment">Increment</button>
     </div>
   </template>

   <script>
   export default {
     computed: {
       count() {
         return this.$store.state.count;
       },
       doubleCount() {
         return this.$store.getters.doubleCount;
       }
     },
     methods: {
       increment() {
         this.$store.dispatch('increment');
       }
     }
   };
   </script>

在上述代码中,通过计算属性countdoubleCount分别访问Vuex中的状态和计算属性。在methods中定义了一个方法increment,用于触发Vuex中的 action。

模块

对于大型应用,可以将 Vuex 的状态拆分成多个模块,每个模块有自己的 state、mutations、actions 和 getters。这样可以更好地组织代码,提高可维护性。

const moduleA = {
  state: {
    // 模块 A 的状态
  },
  mutations: {
    // 模块 A 的 mutations
  },
  actions: {
    // 模块 A 的 actions
  },
  getters: {
    // 模块 A 的 getters
  }
};

const moduleB = {
  state: {
    // 模块 B 的状态
  },
  mutations: {
    // 模块 B 的 mutations
  },
  actions: {
    // 模块 B 的 actions
  },
  getters: {
    // 模块 B 的 getters
  }
};

const store = new Vuex.Store({
  modules: {
    a: moduleA,
    b: moduleB
  }
});

在组件中访问模块的状态和方法时,需要加上模块名:

<template>
  <div>
    <p>Module A Count: {{ moduleACount }}</p>
    <p>Module B Count: {{ moduleBCount }}</p>
    <button @click="incrementModuleA">Increment Module A</button>
    <button @click="incrementModuleB">Increment Module B</button>
  </div>
</template>

<script>
export default {
  computed: {
    moduleACount() {
      return this.$store.state.a.count;
    },
    moduleBCount() {
      return this.$store.state.b.count;
    }
  },
  methods: {
    incrementModuleA() {
      this.$store.dispatch('a/increment');
    },
    incrementModuleB() {
      this.$store.dispatch('b/increment');
    }
  }
};
</script>

八、案例:Todo 应用

下面我们通过一个 Todo 应用的案例来综合运用 Vue 的知识。

  1. 创建组件
    创建以下组件:

    • TodoList.vue:显示待办事项列表。
    • TodoInput.vue:输入新的待办事项。
  2. 配置路由
    创建两个路由://completed,分别显示所有待办事项和已完成的待办事项。

  3. 状态管理
    使用 Vuex 来管理待办事项的状态,包括添加、删除、标记为完成等操作。

  4. 实现功能

    • TodoInput.vue组件中,用户可以输入新的待办事项并提交。
    • TodoList.vue组件中,显示待办事项列表,每个待办事项可以被标记为完成或删除。
    • 在路由/completed中,只显示已完成的待办事项。

以下是部分代码示例:

TodoInput.vue

<template>
  <div>
    <input v-model="newTodo" @keyup.enter="addTodo" placeholder="Add a new todo" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      newTodo: ''
    };
  },
  methods: {
    addTodo() {
      if (this.newTodo.trim()) {
        this.$store.dispatch('addTodo', this.newTodo);
        this.newTodo = '';
      }
    }
  }
};
</script>

TodoList.vue

<template>
  <div>
    <ul>
      <li v-for="todo in todos" :key="todo.id">
        <input type="checkbox" v-model="todo.completed" @change="toggleTodo(todo)" />
        {{ todo.text }}
        <button @click="deleteTodo(todo)">Delete</button>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  computed: {
    todos() {
      return this.$store.state.todos;
    }
  },
  methods: {
    toggleTodo(todo) {
      this.$store.dispatch('toggleTodo', todo);
    },
    deleteTodo(todo) {
      this.$store.dispatch('deleteTodo', todo);
    }
  }
};
</script>

store.js

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

Vue.use(Vuex);

const store = new Vuex.Store({
  state: {
    todos: []
  },
  mutations: {
    addTodo(state, text) {
      state.todos.push({ id: Date.now(), text, completed: false });
    },
    toggleTodo(state, todo) {
      todo.completed =!todo.completed;
    },
    deleteTodo(state, todo) {
      state.todos = state.todos.filter(item => item!== todo);
    }
  },
  actions: {
    addTodo(context, text) {
      context.commit('addTodo', text);
    },
    toggleTodo(context, todo) {
      context.commit('toggleTodo', todo);
    },
    deleteTodo(context, todo) {
      context.commit('deleteTodo', todo);
    }
  }
});

export default store;

router.js

import Vue from 'vue';
import VueRouter from 'vue-router';
import TodoList from './views/TodoList.vue';
import CompletedTodos from './views/CompletedTodos.vue';

Vue.use(VueRouter);

const routes = [
  {
    path: '/',
    name: 'TodoList',
    component: TodoList
  },
  {
    path: '/completed',
    name: 'CompletedTodos',
    component: CompletedTodos
  }
];

const router = new VueRouter({
  mode: 'history',
  routes
});

export default router;

CompletedTodos.vue

<template>
  <div>
    <h2>Completed Todos</h2>
    <ul>
      <li v-for="todo in completedTodos" :key="todo.id">
        {{ todo.text }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  computed: {
    completedTodos() {
      return this.$store.state.todos.filter(todo => todo.completed);
    }
  }
};
</script>

通过这个案例,你可以看到如何使用 Vue 的组件化、路由管理和状态管理来构建一个完整的应用程序。

九、总结

本文介绍了 Vue.js 的基础知识和高级特性,并通过一个 Todo 应用的案例展示了如何综合运用这些知识。Vue.js 是一个非常强大的前端框架,通过不断学习和实践,你可以更好地掌握它,并开发出高效、美观的前端应用程序。

希望本文对你学习 Vue.js 有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2222946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

听一听语音助手的声音

分享自制树莓派语音助手的博文也有一些日子了&#xff0c;今天咱们来听听语音助手自己的声音。 上图是本次对话的log记录&#xff0c;从图上可以看到&#xff0c;主要的对话耗时是用于录音&#xff08;默认5秒&#xff09;和语音识别&#xff08;平均5秒&#xff09;这两个组件…

【数据结构】包装类简单认识泛型-Java

包装类 在Java中&#xff0c;由于基本类型不是继承自Object&#xff0c;为了在泛型代码中可以支持基本类型&#xff0c;Java给每个基本类型都给了一个包装类型 基本数据类型和对应的包装类 基本数据类型包装类ByteByteshortShortint Integer longLongfloatFloatdoubleDoublec…

洞察前沿趋势!2024深圳国际金融科技大赛——西丽湖金融科技大学生挑战赛技术公开课指南

在当前信息技术与“互联网”深度融合的背景下&#xff0c;金融行业的转型升级是热门话题&#xff0c;创新与发展成为金融科技主旋律。随着区块链技术、人工智能技术、5G通信技术、大数据技术等前沿科技的飞速发展&#xff0c;它们与金融领域的深度融合&#xff0c;正引领着新型…

模型的部署:服务端与客户端建立连接(Flask)

目录 一、服务端部署&#xff08;使用Flask&#xff09; 1.安装Flask 2.加载模型&#xff08;这里以识别图片的类型模型为例&#xff09; 3.定义API端点 4.运行Flask应用 二、客户端请求 1.安装HTTP客户端库 2.发送请求 请求成功示例&#xff1a; 监控与日志 总结 在…

物联网消息队列Emqx日志配置及日志追踪以及Centos7上的rc.local开机不执行、git提交的小问题

一、物联网消息队列Emqx日志配置及日志追踪 EMQX支持将日志输出到控制台或者日志文件&#xff0c;或者同时使用两者。使用 Docker 部署 EMQX&#xff0c;默认只能通过 docker logs 命令查看 EMQX 日志。EMQX 的默认日志级别为 warning&#xff0c;默认在单日志文件超过10MB(log…

nginx 隐藏版本号与WEB服务器信息

nginx 隐藏版本号与WEB服务器信息 1.安装相关软件2.下载软件包解压并进入3.修改C文件4.编译配置./configure --prefix/usr/local/nginx5.编译安装make && make install5.1.错误处理15.2.错误处理25.2.编译安装make && make install 6.修改nginx配置文件,http节…

【Vue】Vue3.0(十四)接口,泛型和自定义类型的概念及使用

上篇文章&#xff1a; 【Vue】Vue3.0&#xff08;十三&#xff09;中标签属性ref&#xff08;加在普通标签上、加在组件标签上&#xff09;、局部样式 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Vue专栏&#xff1a;点击&#xff01; ⏰️创作时间&…

从0开始深度学习(20)——延后初始化和自定义层

一般情况下&#xff0c;模型参数在被创建时就被立即初始化了&#xff0c;但如果使用了延后初始化技术&#xff0c;就能在首次传入数据后&#xff0c;再初始化参数&#xff0c;旨在输入维度未知的情况下&#xff0c;预定义灵活的模型&#xff0c;动态推断各个层的参数大小。 有时…

robosense 激光雷达安装

官方github 1、ROBOSENSE 驱动安装并运行 1、改雷达型号 2、修改网口地址 3、改变点的类型 https://github.com/RoboSense-LiDAR/rslidar_sdk/blob/main/doc/howto/05_how_to_change_point_type.md 2、ROBOSENSE 点云转换成 velodyne git clone https://github.com/HVikto…

Linux 部署 Harbor 镜像仓库详解

文章目录 安装 Docker安装 Harbor访问 Harbor 安装 Docker 本次部署流程使用的是1台阿里云ECS&#xff1a; Ubuntu 22.04&#xff0c;2核4G开放 9999 端口号 首先需要做的是在当前服务器上&#xff0c;安装好 Docker&#xff0c;参考链接如下&#xff1a; https://blog.csdn.n…

算法(四)前缀和

前缀和也是一个重要的算法&#xff0c;一般用来快速求静态数组的某一连续区间内所有数的和&#xff0c;效率很高&#xff0c;但不支持修改操作。分为一维前缀和、二维前缀和。 重要的前言&#xff01; 不要死记模板&#xff0c;具体题目可能是前缀和、前缀乘积、后缀和、后缀乘…

qt 构建、执行qmake、运行、重新构建、清除

qt右键功能有 构建、执行qmake、运行、重新构建、清除&#xff0c;下面简单介绍一下各个模块的作用。 1. 执行qmake qmake是一个工具&#xff0c; 它根据pro文件生成makefile文件&#xff0c;而makefile文件中则定义编译与连接的规则。pro文件中定义了头文件&#xff0c;源文件…

【C++干货篇】——C/C++内存管理

【C干货篇】——C/C内存管理 文章目录 【C干货篇】——C/C内存管理1.C/C内存分布1.1静态区/数据段&#xff1a;1.2常量区/代码段&#xff1a;1.3栈&#xff1a;1.4堆&#xff1a;1.5. 内存映射区&#xff1a; 2.C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free…

[笔记] 关于CreateProcessWithLogonW函数创建进程

函数介绍 https://learn.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-createprocesswithlogonw BOOL CreateProcessWithLogonW([in] LPCWSTR lpUsername,[in, optional] LPCWSTR lpDomain,[in] …

【lca,树上差分】P3128 [USACO15DEC] Max Flow P

题意 给定大小为 n ( 2 ≤ n ≤ 5 1 0 4 ) n(2 \leq n \leq 5 \times 10^4) n(2≤n≤5104) 的树&#xff0c;并给定 m ( 1 ≤ m ≤ 1 0 5 ) m(1 \leq m \leq 10^5) m(1≤m≤105) 条树上的路径&#xff08;给定两个端点&#xff0c;容易证明两个点树上路径唯一&#xff09;&…

分布式-单元化架构1

一 两地三中心 1.1 两地三中心* 两地指的是两个城市&#xff1a;同城&#xff0c;异地。三中心指的是三个数据中心&#xff1a;生产中心、同城容灾中心、异地容灾中心。 在同一个城市或者临近的城市建设两个相同的系统&#xff0c;双中心具备相当的业务处理能力&#xff0c;…

【MySQL】索引的机制、使用

在学习索引知识之前&#xff0c;我们可以先了解一下什么是索引。实际上&#xff0c;索引就是数据库中一个或多个列存储的结构&#xff0c;能够支持数据库管理系统在不扫描整张表的情况下也能查询到数据行&#xff0c;能够大大提升查询效率。举个例子&#xff0c;我们想要找到一…

技术成神之路:设计模式(二十二)命令模式

相关文章&#xff1a;技术成神之路&#xff1a;二十三种设计模式(导航页) 介绍 命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;允许将请求&#xff08;命令&#xff09;封装为对象&#xff0c;从而使您可以使用不同的请求、队列或记录请求日…

硬件基础知识补全计划【一】电阻

一、电阻理论 1.1 电流定义 电流&#xff1a;电流的强弱用电流强度来描述&#xff0c;电流强度是单位时间内通过导体某一横截面的电荷量&#xff0c;简称电流&#xff0c;用I表示。1 秒内有 6.241509310^18 个元电荷通过横截面的电流&#xff0c;定义为 1 安 (A)。 电压&…

【C++】在Windows中使用Boost库——实现TCP、UDP通信

目录 一、编译Boost库 二、TCP服务端 三、TCP客户端 四、UDP连接 一、编译Boost库 1. 先去官网下载Boost库源码 2. 点击下载最新的版本 下载Windows环境的压缩包&#xff0c;然后解压 3. 在解压后的目录路径下找到“bootstrap.bat” 打开控制台&#xff0c;在“bootstrap.…