在前面两个章节中,介绍了Vue项目初始环境的搭建,以及Vue项目目录结构和相关的项目文件说明。本节介绍一下Vue的相关定义和语法,主要内容来自Vue的官方文档,我选的是当前最新版本V3。
但是我使用的例子跟官网的会有所不同,但最终结果都是一样的。本节内容非常简单,记录下来作为我自已完整的一个复习笔记。
一、Vue是什么
Vue是一套用于构建用户界面的渐进式框架,与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用,Vue 的核心库只关注视图层。
二、声明式渲染
Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统。来看一段例子:
1 <template> 2 <div>Counter: {{ counter }}</div> 3 </template> 4 5 <script> 6 export default { 7 data() { 8 return { 9 counter: 0, 10 }; 11 }, 12 }; 13 </script>
成功创建了第一个 Vue 应用!看起来这跟渲染一个字符串模板非常类似,但是 Vue 在背后做了大量工作。现在数据和 DOM 已经被建立了关联,所有东西都是响应式的。除了文本插值,我们还可以像这样绑定元素的 attribute:
1 <template> 2 <div> 3 <span v-bind:title="message"> 4 鼠标悬停几秒钟查看此处动态绑定的提示信息! 5 </span> 6 </div> 7 </template> 8 <script> 9 export default { 10 name: "Test", 11 data() { 12 return { 13 message: "safsadf" 14 } 15 }; 16 </script>
v-bind
attribute 被称为指令。指令带有前缀 v-
,以表示它们是 Vue 提供的特殊 attribute
三、处理用户输入
用 v-on
指令添加一个事件监听器,通过它调用在实例中定义的方法:
1 <template> 2 <div> 3 <p>{{ message }}</p> 4 <button v-on:click="reverseMessage">反转Message</button> 5 </div> 6 </template> 7 <script> 8 export default { 9 name: "Test", 10 data() { 11 return { 12 message: "safsadf" 13 }; 14 }, 15 methods: { 16 reverseMessage() { 17 this.message = this.message.split("").reverse().join(""); 18 }, 19 }, 20 }; 21 </script>
所有的 DOM 操作都由 Vue 来处理,你编写的代码只需要关注逻辑层面即可。Vue 还提供了 v-model
指令,它能轻松实现表单输入和应用状态之间的双向绑定。
四、条件和循环
主要通过v-if指令,如:
1 <div id="conditional-rendering"> 2 <span v-if="seen">现在你看到我了</span> 3 </div> 然后通过seen变量等于true或者false来控制元素显示或者隐藏,其实背后的原理是通过生成css display等于none或者true实现的。
v-for
指令可以绑定数组的数据来渲染一个项目列表,这里就不举例了,直接看下一节,是本文的重点。
五、组件化应用构建
组件系统是 Vue 的另一个重要概念,因为它是一种抽象,允许我们使用小型、独立和通常可复用的组件构建大型应用。几乎任意类型的应用界面都可以抽象为一个组件树。
组件本质上是一个具有预定义选项的实例。在components文件夹下我们新建TodoItem.vue文件,并编写如下内容:
1 <template> 2 <li>{{ todo.text }}</li> 3 </template> 4 <script> 5 export default { 6 name: "todo-item", 7 props: ["todo"], 8 }; 9 </script>
这样一个简单的组件就定义好了,这里重点是props属性接口,它是与外部数据进行通信的桥梁。接下再在任意vue文件中来使用这个组件:
1 <template> 2 <div> 3 <ol> 4 <todo-item v-for="item in list" v-bind:todo="item" v-bind:key="item.id"> 5 </todo-item> 6 </ol> 7 </div> 8 </template> 9 10 <script> 11 import TodoItem from "./TodoItem.vue"; 12 export default { 13 name: "Test", 14 components: { 15 TodoItem, 16 }, 17 data() { 18 return { 19 list: [ 20 { id: 0, text: "Vegetables" }, 21 { id: 1, text: "Cheese" }, 22 { id: 2, text: "Whatever else humans are supposed to eat" }, 23 ], 24 }; 25 } 26 }; 27 </script>
通过import TodoItem from "./TodoItem.vue";来导入这个组件,通过在components属性中赋值TodoItem,声明需要使用这个组件,案例中通过使用v-for指令来遍历list数据,通过v-bind:todo绑定到元素中。注意这里一定要绑定v-bind:key来区分元素,不希望会报错。
示例中将应用分割成了两个更小的单元,子单元通过 prop 接口与父单元进行了良好的解耦。现在可以进一步改进 <todo-item>
组件,提供更为复杂的模板和逻辑,而不会影响到父应用。
在一个大型应用中,有必要将整个应用程序划分为多个组件,以使开发更易管理。