在上一篇文章中,我们介绍了 Vue.js 的起源、设计理念、核心特性 已经项目规范化配置
。我们学习了如何搭建 Vue 开发环境,并熟悉了一些常用的 Vue 开发工具和插件
正文开始
,如果觉得文章对您有帮助,请帮我三连+订阅,谢谢
💖💖💖
每个 Vue 应用都是从创建一个新的 Vue 实例开始的。Vue 实例是一个包含选项的对象,这些选项包括数据
、方法
、生命周期钩子
等。
var vm = new Vue({ el: "#app", // 指定Vue应该绑定到的DOM元素 data: { message: "Hello Vue!", // 响应式数据 }, methods: { sayHello: function () { alert(this.message); }, }, });
在这个实例中,el
属性指定了 Vue 将接管哪个 DOM 元素,data
属性包含了 Vue 实例的数据对象,methods
属性包含了 Vue 实例可以调用的方法。
Vue 实例有多种选项,以下是一些常用的选项:
data
: 组件的数据对象。methods
: 定义组件的方法。computed
: 定义计算属性。watch
: 定义侦听器。props
: 子组件的外部数据。el
: 指定 Vue 应该绑定到的 DOM 元素。Vue 的模板语法让我们能够声明式地将数据渲染进 DOM。
插值表达式允许我们把数据插到模板中。
Message: {{ message }}
当message
数据变化时,页面上对应的文本也会更新。
指令是 Vue 模板中的特殊标记,带有前缀v-
,用于告诉 Vue 框架需要对 DOM 元素进行一些特殊的处理。
用于动态地绑定一个或多个属性,或一个组件 prop。
在表单输入和应用状态之间创建双向数据绑定。
监听 DOM 事件。
Vue 允许我们通过自定义指令向元素添加自己的功能。自定义指令
可以钩入到 Vue 的编译过程中,允许我们对元素进行低层次操作。
// 注册一个全局自定义指令 `v-focus` Vue.directive("focus", { // 当被绑定的元素插入到DOM时…… inserted: function (el) { // 聚焦元素 el.focus(); }, });
钩子函数
自定义指令有以下几个钩子:
bind
: 只调用一次,指令第一次绑定到元素时调用。inserted
: 被绑定元素插入父组件时调用。update
: 所在组件的 VNode 更新时调用。componentUpdated
: 父组件更新,该钩子被调用。unbind
: 只调用一次,指令与元素解绑时调用。假设我们需要一个指令来控制元素的尺寸,根据数据属性调整大小:
Vue.directive("resize", { bind(el, binding) { el.style.width = binding.value.width + "px"; el.style.height = binding.value.height + "px"; }, update(el, binding) { if (binding.oldValue !== binding.value) { el.style.width = binding.value.width + "px"; el.style.height = binding.value.height + "px"; } }, });
在模板中使用:
其中resizeObj
是 Vue 实例的数据对象,包含width
和height
属性。
指令不仅可以全局注册
,还可以局部注册
到单个 Vue 实例。
new Vue({ directives: { focus: { // 指令定义 inserted: function (el) { el.focus(); }, }, }, });
在实例的模板中使用:
过滤器用于在插值表达式中转换输出文本。
{{ message | capitalize }}
filters: { capitalize: function (value) { if (!value) return ''; value = value.toString(); return value.charAt(0).toUpperCase() + value.slice(1); } }
Vue 的数据绑定是通过响应式系统实现的,该系统确保数据变化时视图能自动更新。
data: { firstName: 'John', lastName: 'Doe' }
在模板中:
{{ firstName }} {{ lastName }}
当firstName
或lastName
变化时,视图会自动更新。
Vue 使用Object.defineProperty
来劫持数据对象的属性,当属性值变化时,视图会自动更新。
v-model
在 Vue 中通常用于创建数据双向绑定,它主要是语法糖,背后是:value
和@input
的结合。在组件中,我们可以自定义v-model
的行为。
v-model
在组件中,我们可以通过model
选项来自定义v-model
:
Vue.component("child-component", { model: { prop: "customValue", // 指定prop的名称 event: "change", // 指定事件的名称 }, props: ["customValue"], methods: { updateValue: function (event) { this.$emit("change", event.target.value); // 触发事件,并传入新值 }, }, template: ` `, });
使用自定义v-model
的组件:
在这个示例中,parentValue
是父组件中的数据,通过v-model
与child-component
组件绑定。组件内部,我们监听input
事件,并在事件发生时,通过$emit
触发一个change
事件,并传递新的值。
v-model
可以与修饰符一起使用,如.lazy
、.number
和.trim
,以控制输入的更新时机和行为。radio
、checkbox
和select
等不同类型的表单元素,Vue 提供了不同的处理方式来确保v-model
的双向绑定能正常工作。Vue 允许我们在模板中直接监听 DOM 事件,并在 Vue 实例的方法中处理这些事件。
methods: { sayHello: function () { alert('Hello ' + this.username); } }
在模板中:
当用户在输入框中输入时,username
的值将自动更新,并且如果username
在数据对象中变化,输入框的内容也会同步更新。
Vue 的数据绑定不仅限于简单的文本展示和表单输入,它还包括更复杂的场景。
Vue 可以响应式地更新对象和数组,但需要注意使用Vue.set
来保持响应性。
// 对于新属性 Vue.set(vm.someObject, "newProperty", 123);
// 添加元素 vm.someArray.push(123); // 删除元素 vm.someArray.splice(index, 1);
Vue 提供了事件处理的修饰符,如.stop
、.prevent
、.capture
等,来简化事件处理。
Vue 允许你监听特定的按键,如.enter
、.tab
等。
Vue 组件系统是构建大型应用程序的关键。组件允许我们通过组合较小的、可复用的部件来构建大型应用程序。
Vue.component("my-component", { template: "A custom component!", });
在模板中使用:
组件可以接受外部传入的数据,这些数据被称为 props。
Vue.component("child-component", { props: ["greeting"], template: "{{ greeting }}
", });
使用:
组件可以触发事件,这些事件可以被父组件监听。
Vue.component("child-component", { template: ` `, methods: { notifyParent() { this.$emit("notify", "Message from child"); }, }, });
父组件监听事件:
methods: { handleNotification: function (message) { alert(message); } }
通过本篇文章,我们全面学习了 Vue 的基础语法,包括 Vue 实例和选项、模板语法、数据绑定、事件处理、组件系统的基础,以及过滤器。这些知识点构成了 Vue 应用开发的基础。在接下来的专栏文章中,我们将继续深入探索 Vue 的高级特性和最佳实践。
欢迎在文章下方留言,分享学习 Vue 基础语法的心得体会,或提出在学习过程中遇到的问题。我将在后续的文章中提供解答和指导。