| ✍️ Tangxt | ⏳ 2020-07-10 | 🏷️ 组件 API |
.vue文件里边,<template>内容</template>里边的内容是 XML 语法哈!可不是 HTML 语法 -> 这意味着单标签必须闭合,如<input />(HTML推荐单标签不用闭合),当然,还有一种奇葩的语法就是标签里边咩有内容时,可以直接用/闭合,如<div />(HTML可不支持这样搞!) -> 为什么尤大会选择 XML 语法呢? -> 因为「严格的 XML 语法比松散的 HTML 语法相比起来更容易编译」html 文件中夹杂 vue 语法,导致各类型文件融合到一块,耦合性大 -> 这也解释了为啥要有单文件组件.vue
Vue 的实例命名为 vm , vm 对象封装了对视图的所有操作包括数据读写、事件绑定、DOM 更新vm 的构造函数是Vue,按照ES6的说法, vm 所属的类是Vueoptions是new Vue的参数,一般称为选项或构造选项图中信息的关注顺序:
options->vm->Vue->Vue.prototype->Vue.prototype.__proto__
new Vue有哪些构造选项?都可以在 API — Vue.js 找到……

学习顺序 -> 类似红橙黄绿青蓝紫 -> 不分层次地去了解每个属性的话,等于白学……
$mount代替props -> 外部数据
message="n" 传入字符串:message="n" 传入 this.n 数据:fn="add" 传入 this.add 函数四个钩子
data 变化,就执行的函数options.watch 用法this.$watch 用法deep、immediate 含义v-if/v-for/v-bind/v-onv-focusVue.extendmixin 还是重复View,它继承 Vueextends呢?propsData
render
renderError
beforeCreate
beforeMount
beforeUpdate
beforeDestroy
el 和 data 选项

创建一个 Demo.vue:

在另一个地方使用这个 Demo 组件:

el的取值:CSS选择器 or 一个 HTMLElement 实例
#app or document.querySelector('#app')// 自动挡:
new Vue({
el: '#app',
render: h => h(Demo)
})
// 手动挡:
new Vue({
render: h => h(Demo)
}).$mount('#app')
手动挂载 vs 自动挂载
Q:Vue 实例的作用范围是?
Vue会管理
el选项命中的元素以及内部的后代元素
Q:只能使用 `id` 选择器吗?
也可以使用其它的选择器 -> 但建议使用
id选择器!
Q:是否可以设置成其它的 DOM 元素?
可以使用其它的双标签 -> 但不能使用
html和body
data中data中可以写复杂类型的数据,如普通对象、数组、函数……functiondata旗下的属性值就行了,注意别忘了添加大胡子语法,即🟡🟡message🟡🟡、🟡🟡id+1🟡🟡、🟡🟡user.name🟡🟡、🟡🟡user.hobby[2]🟡🟡、🟡🟡fn('hi')🟡🟡Q:如果`data`旗下某个属性的值是 `null` or `undefined`?
如是message属性,那么你在 template 这样写:🟡🟡message🟡🟡,那就不显示了!
Q:大胡子语法?
Github Pages 解析这个语法{-{}}是有问题的(请忽视那个-),我就用🟡🟡🟡🟡代替了!
我们读🟡🟡🟡🟡 -> “Mustache”语法 (双大括号)
数据绑定的最常见的形式:
🟡🟡message🟡🟡 -> 这一整坨东西就是message的值,即你不会在视图中看到🟡🟡🟡🟡注意:双大括号会将数据解释为普通文本,而非 HTML 代码。为了输出真正的 HTML,你需要使用 v-html -> 如果message是HTML字符串值,那么你就 v-html = 'message'
如:
<p>Using v-html directive: <span v-html="rawHtml"></span></p>
<!-- rawHtml的值是:<span>'hi'</span> -->
<!-- 作为内容插入,也就是作为儿子插入 -->
<p>Using v-html directive: <span><span>'hi'</span></span></p>
Q:为什么要优先使用函数?
data都是一个新的data,而不是共用一个datamethods旗下有个方法(更新视图数据的操作),那么每次更新都会触发重新渲染,影响性能,所以多用watch和computed来代替类似这样的操作!使用:
// 定义
{
methods: {
add() {this.n++},
filter(){
return 'hi'
}
}
}
<!-- template -->
<div id="app">
🟡🟡n🟡🟡
<button @click="add">+1</button>
🟡🟡filter()🟡🟡
</div>
🟡🟡filter()🟡🟡->filter()-> 函数调用表达式!
每个 Vue 组件都是一个 Vue 实例
Vue.component -> 完整版才支持
component第一个参数为你定义组件的名字,第二个参数跟Vue实例options一样data必须是一个函数,避免引用同样的内存地址,导致数据错乱html标签发生冲突 -> 即命名首字母大写,如App-xxxcomponentes命名是保持一致(与引用时),如import Demo from ''./Demo.vue,那么就可以这样写 components:{Demo} 啦! -> 简写成一个 Demo 美滋滋局部注册(只能局部使用,不能分享给其它全局组件使用):
// 推荐这种姿势引入其它组件到Xxx组件里边的template
import Demo from "./Demo.vue";
const vm = new Vue({
// 局部注册组件 -> 这样当前这个vm实例的template就能直接使用了
components: {
Add: Demo
},
// or ES6解析赋值
// components: {Demo} -> 写在template得这样:<Demo/>
// JS的对象属性名对大小写是敏感的,即 var o = {Name:'ya',name:'5'}
// o.Name 为 'ya',o.name 为 '5'
data(){
return {
n: 0
}
},
template: `
<Add/>
`
})
全局注册:
// args1:id,args2:definition -> 本质就是 options
Vue.component('Demo',{
template: `
<div>hi</div>
`
})
// 使用
const vm = new Vue({
data() {
return {
n: 0
}
},
template: `
<div>
<Demo/>
</div>
`
})
从 Vue 实例创建、运行、到销毁期间,总是伴随着各种各样的事件,这些事件,统称为生命周期!
周期就像是:立个flag(未开始) -> 实现flag(进行中) -> 划掉flag(已完成)

先天
new Vue()一下,会有多个钩子函数自动执行,不同的钩子函数在执行的时候,可能会拿到不同的数据,如beforeCreate钩子执行时,就拿不到data、methods里边的数据!而created钩子在执行时,就可以拿到data、methods里边的数据,这样我们就可以调用methods中的方法去操作data中的数据了!
主要关注
created、mounted、updated、destroyed这四个钩子!
data和methods属性data和methods已经初始化完成,此时还没有开始编译模板 -> 此时的组件在内存中,没有出现在页面中div#appdiv#app1了click事件绑定的add方法,对data中的n值+1,然后再执行这个钩子! -> 此时可以获取到在内存中的n的最新值,但视图中的n值还是旧值 -> 页面渲染前或者说视图更新前执行data中的状态值和页面中上显示数据改动了或者更新了会执行该函数 -> 在页面渲染了最新数据之后就会执行它
运行期间的钩子可以多次执行 -> 创建期间的钩子只执行一次,当然,通过点击按钮
v-if=false后,组件视图消失,组件实例的生命周期结束,然后你再点击按钮,v-if=true后,组件重新开始新的一轮生命周期!即又会来一次创建期间的钩子执行……

demo:测试8个生命周期钩子
props来实现:多用于传入变量
在父组件里边,写在
Props这个自定义标签上的message和fn(命名)属性是由被引用的组件所决定的,在这里也就是Props组件决定的! -> 总之,这不是我们父组件固定的命名 -> 即子组件决定了自己要接收哪些外部数据!
props,那么其中的元素值,就是父组件使用子组件标签时,所写上的标签属性! -> 就像是这样 <div class="father"><a href="xxx.html">click me</a></div>,href属性可不是乱写的哦!这是固定写法呀!由a标签天生决定的!