应用实例 & 组件实例:
- Vue3 以 Vue.createApp 创建 vue实例的【不是 Vue2 的new Vue 创建】,参数就是 根组件实例。
const app = Vue.createApp({ /* 选项 */ })
- 应用实例暴露的大多数方法都会返回该同一实例,允许链式:
Vue.createApp({}) .component('SearchInput', SearchInputComponent) .directive('focus', FocusDirective) .use(LocalePlugin)
- Vue挂载应用,使用 mount 方法:与大多数应用方法不同的是,mount 不返回应用本身。相反,它返回的是根组件实例。
const vm = app.mount('#app') // vm 是根组件实例,而不是 应用实例
模板语法
- 指令 动态参数:【指令 的动态参数 很少使用到】
<a v-bind:[attributeName]="url"> ... </a> // attributeName是 组件的 property 值,即vue的 data变量。如,令 attributeName="href",那么这个绑定将等价于 v-bind:href
- 同样事件的 绑定也可以是动态的:
<a v-on:[eventName]="doSomething"> ... </a>
Class 与 Style 绑定
- 在组件上绑定 HTML Class:
如果你的组件有多个根元素【vue2的组件只有一个根元素,vue3是可以多个根元素的】,你需要定义哪些部分将接收这个类。可以使用 $attrs 组件属性执行此操作:<div id="app"> <my-component class="baz"></my-component> </div>
const app = Vue.createApp({}) app.component('my-component', { template: ` <p :class="$attrs.class">Hi!</p> <span>This is a child component</span> ` })
事件处理
修饰符
自定义事件
【组件标签中才会使用自定义事件,原生标签中没有自定义事件】
-
推荐 始终使用 kebab-case 的事件名,即自定义的事件名,使用 kebab-case 命名【全部小写的,短横线命名】。
-
自定义组件的 v-model:【组件标签的 v-model 修改 才意义;原生标签中 无法修改v-model传递参数,也没有意义】
- 默认情况下,组件上的 v-model 使用 modelValue 作为 prop 和 update:modelValue
作为事件。我们可以通过向 v-model 传递参数来修改这些名称: - 分析:默认情况 v-model 中 v-bind 绑定的 modelValue属性【vue2中绑定的是value属性】。通过 v-model 传递参数,可以修改v-model绑定的props 属性名。
<my-component v-model:foo="bar"></my-component>
const app = Vue.createApp({}) app.component('my-component', { props: { foo: String }, template: ` <input type="text" :value="foo" @input="$emit('update:foo', $event.target.value)"> ` })
- 默认情况下,组件上的 v-model 使用 modelValue 作为 prop 和 update:modelValue
-
组件上多个 v-model 绑定:基于上面讲的 通过向 v-model 传递参数,可以修改 v-model 绑定不同的 属性。从而实现 组件中 可以 多个 变量 实现双向绑定。
<user-name v-model:first-name="firstName" v-model:last-name="lastName" ></user-name>
const app = Vue.createApp({}) app.component('user-name', { props: { firstName: String, lastName: String }, template: ` <input type="text" :value="firstName" @input="$emit('update:firstName', $event.target.value)"> <input type="text" :value="lastName" @input="$emit('update:lastName', $event.target.value)"> ` })
插槽
- 插槽 渲染作用域: 插槽 里面 变量的作用域 是 其 所在模板中 作用域。不能访问 子组件内的作用域。
- 插槽的 后备内容:在插槽没有提供内容的时候被渲染。【在 slot 没有内容输入进来时,就会渲染 slot 里面默认是值】
- 具名插槽: 元素有一个特殊的 attribute:name; 一个不带 name 的 出口会带有隐含的名字“default”。
- 作用域插槽【让插槽内容能访问子组件的数据】:默认是 无法访问的,通过给 slot 设置 插槽 prop。就可以把 子组件的 数据,传递到 插槽内容上。
- 动态插槽名
- 具名插槽的缩写: 跟 v-on 和 v-bind 一样,v-slot 也有缩写,即把参数之前的所有内容 (v-slot:) 替换为字符 #。
提供 / 注入【provide 和 inject】:
父组件可以作为其所有子组件的依赖项提供程序,而不管组件层次结构有多深。这个特性有两个部分:父组件有一个 provide 选项来提供数据,子组件有一个 inject 选项来开始使用这个数据。