赞
踩
目录
vue3.x 和 vue2.x 版本的对比
vue 2.x 调试工具:
1.1 注册组件的两种方式
1.2 全局注册组件
-
- app.component('注册标签',导入组件名)
通过component节点 为当前组件注册
1.4 组件注册时名称的大小写
在进行组件的注册时,定义组件注册名称的方式有两种:
<MyComponent :num="count"></MyComponent>
props :['num']
- 父组件中
- <MyComponent v-model:num="count">
-
- emits: ['update:num'],
- 子组件中
- methods : {
- add(){
- this.$emit( 'update:num',this.num + 1)
- }
- }
- // 所有的侦听器,都应该被定义到 watch 节点下
- watch: {
- // 侦听器本质上是一个函数,要监视哪个数据的变化,就把数据名作为方法名即可
- // 新值在前,旧值在后
- username(newVal,oldVal) {
- console.log(neVal,oldVal)
-
- }
- // 如果要侦听的是对象的子属性的变化,则必须包裹一层单引号
- 'info.username'(newVal) {
- console.log(newVal)
- }
组件的生命周期指的是:组件从创建 -> 运行(渲染) -> 销毁的整个过程,强调的是一个时间段。
npm i mitt@2.1.0 -S
- import mitt from 'mitt'
-
- const bus = mitt()
-
- export default bus
- import bus from './eventBus.js'
-
- data(){return {}count : 0 }
- cerated(){
- bus.on('countChange',(count) =>{
- this.num = count
- })
- }
- import bus from './eventBus.js'
-
- data(){return {}count : 0 }
-
- methods: {
- add(){
- this.count++
- bus.emit('countChange' ,this.count)
- }
- }
- data() {return {color: 'red' } },
- provide(){ return{color : this.color } }
子孙节点可以使用 inject 数组,接收父级节点向下共享的数据
inject : ['color']
- // 从vue中按需导入 computed 函数
- import { computed } from 'vue'
- //使用computed 函数 把数据共享包装为响应式
- provide(){ return{color : computed( () => this.color ) } }
<h1>子孙组件 {{color.value}}</h1>
- import axios from 'axios'
-
-
- axios.defaults.baseURL = '请求根路径'
-
- app.config.globalProperties.$http = axios
-
get请求:
- methods: {
- async getInfo() {
- const { data: res } = await this.$http.get('/api/get', {
- params: {
- name: 'ls',
- age: 20,
- },
- })
-
- console.log(res)
- },
- }
post请求:
- methods: {
- async postInfo() {
- const { data: res } = await this.$http.post('/api/post', { name: 'zs', age: 20 })
- console.log(res)
- },
- }
ref 用来辅助开发者在 不依赖于 jQuery 的情况下 ,获取 DOM 元素或组件的引用。
每个 vue 的组件实例上,都包含一个 $refs 对象 ,里面存储着对应的 DOM 元素或组件的引用。默认情况下,组件的 $refs 指向一个空对象 。
- <template>
- <button @click="showThis">打印 this</button>
- </template>
- export default {
- methods: {
- showThis() {
- // this 是当前 App 组件的实例对象
- console.log(this)
- }
- }
使用 ref 引用 DOM 元素
- <h1 ref="myh1">App 根组件</h1> //加ref属性 起名字
- <button @click="showThis">打印 this</button>
- export default {
- methods: {
- showThis() {
- // this 是当前 App 组件的实例对象
- console.log(this)
- this.$refs.myh1.style.color = 'red' //这里的myh1与上面名称对应
- }
- }
使用 ref 引用组件实例
- //子组件
-
- <template>
- <div class="left-container">
- <h3>Left 组件 --- {{ count }}</h3>
- <button @click="count += 1">+1</button>
- <button @click="resetCount">重置</button>
- </div>
- </template>
-
- <script>
- export default {
- data() {
- return {
- count: 0
- }
- },
- methods: {
- resetCount() {
- this.count = 0
- }
- }
- }
- </script>
/父组件中 使用ref属性 为组件添加引用名称
通过this.$refs.引用名称 可以引用组件的实力
- <button @click="onReset">重置 Left 组件的 count 值为 0</button>
-
-
- <Left ref="comLeft"></Left>
-
- methods: {
- onReset() {
- this.$refs.comLeft.resetCount()
- // this.$refs.comLeft.count = 0
- }
- }
控制文本框和按钮的按需切换
通过布尔值 inputVisible 来控制组件中的文本框与按钮的按需切换
当文本框展示出来之后,如果希望它立即获得焦点,则可以为其添加 ref 引用,并调用原生 DOM 对象的 .focus() 方法
组件的 $nextTick(cb) 方法,会把 cb 回调 推迟到下一个 DOM 更新周期之后执行 。通俗的理解是:等组件的 DOM 更新完成之后,再执行 cb 回调函数。从而能保证 cb 回调函数可以操作到最新的 DOM 元素。
-
- <input type="text" v-if="inputVisible" @blur="showButton" ref="iptRef" />
- <button v-else @click="showInput">展示输入框</button>
- export default {
- data() {
- return {
- // 控制输入框和按钮的按需切换;
- // 默认值为 false,表示默认展示按钮,隐藏输入框
- inputVisible: false
- }
- },
- methods: {
- // 点击按钮,展示输入框
- showInput() {
- // 1. 切换布尔值,把文本框展示出来
- this.inputVisible = true
- // 2. 让展示出来的文本框,自动获取焦点 引用this.$nextTick(cb) 方法
- this.$nextTick(() => {
- this.$refs.iptRef.focus()
- })
- },
- showButton() {
- this.inputVisible = false
- }
- }
动态组件指的是 动态切换组件的显示与隐藏
实现动态组件渲染
vue 提供了一个内置的 <component> 组件, 专门用来实现动态组件的渲染
- <!-- 1. component 标签是 vue 内置的,作用:组件的占位符 -->
- <!-- 2. is 属性的值,表示要渲染的组件的名字 -->
- <!-- 3. is 属性的值,应该是组件在 components 节点下的注册名称 -->
- <button @click="comName = 'Left'">展示 Left</button>
- <button @click="comName = 'Right'">展示 Right</button>
- <component :is="comName"></component>
- data() {
- return {
- // comName 表示要展示的组件的名字
- comName: 'Left'
- }
- },
当is 指向另外一个组件时原本的组件会被销毁
使用 keep-alive 保持状态
默认情况下,切换动态组件时无法保持组件的状态。此时可以使用 vue 内置的 <keep-alive> 组件保持动态组 件的状态。示例代码如下:
<keep-alive><component :is="comName"></component></keep-alive>
keep-alive 会把内部的组件进行缓存,而不是销毁组件
插槽 ( Slot )是 vue 为 组件的封装者 提供的能力。允许开发者在封装组件时,把 不确定的 、 希望由用户指定的 部分 定义为插槽
- 组件中
- <!-- 声明一个插槽区域 -->
- <!-- vue 官方规定:每一个 slot 插槽,都要有一个 name 名称 -->
- <!-- 如果省略了 slot 的 name 属性,则有一个默认名称叫做 default -->
- <slot name="default"></slot>
- <Left>
- <!-- 默认情况下,在使用组件的时候,提供的内容都会被填充到名字为 default 的插槽之中 -->
- <!-- 1. 如果要把内容填充到指定名称的插槽中,需要使用 v-slot: 这个指令 -->
- <!-- 2. v-slot: 后面要跟上插槽的名字 -->
- <!-- 3. v-slot: 指令不能直接用在元素身上,必须用在 template 标签上 -->
- <!-- 4. template 这个标签,它是一个虚拟的标签,只起到包裹性质的作用,但是,不会被渲染为任何实质性的 html 元素 -->
- <!-- 5. v-slot: 指令的简写形式是 # -->
-
- <template #default>
- <p>这是在 Left 组件的内容区域,声明的 p 标签</p>
- </template>
- </Left>
没有预留插槽的内容会被丢弃
后备内容
具名插槽
<slot name="title"></slot>
为具名插槽提供内容
- <template #title>
- <h3>一首诗</h3>
- </template>
作用域插槽
<slot name="content" msg="hello vue.js"></slot>
使用 v-slot: 的形式,接收作用域插槽对外提供的数据
作用域插槽对外提供的数据对象,可以使用 解构赋值 简化数据的接收过程
- <template #content="scope">
- //或者
- <template #content="{ msg, user }">
在封装 MyTable 组件的过程中,可以通过作用域插槽把表格每一行的数据传递给组件的使用者
在使用 MyTable 组件时,自定义单元格的渲染方式,并接收作用域插槽对外提供的数据
vue 官方提供了 v-text、v-for、v-model、v-if 等常用的指令。除此之外 vue 还允许开发者自定义指令。
自定义指令的分类
在每个 vue 组件中,可以在 directives 节点下声明私有自定义指令。示例代码如下:
在使用自定义指令时,需要加上 v- 前缀
- directives: {
- // 定义名为 focus 的指令,指向一个配置对象
- focus: {
- // 当指令第一次被绑定到元素上的时候,会立即触发 mounted 函数
- // 形参中的 el 表示当前指令所绑定到的那个 DOM 对象
- mounted(el) {
- el.focus()
- }
- }
全局共享的自定义指令需要通过“单页面应用程序的实例对象”进行声明
- const app = vue.createApp{}
- // 定义名为 v-focus 的指令,指向一个配置对象
- app.directives: { 'focus', {
- // 当指令第一次被绑定到元素上的时候,会立即触发 mounted 函数
- // 形参中的 el 表示当前指令所绑定到的那个 DOM 对象
- mounted(el) {
- el.focus()
- }
- }
- app.directives ( 'focus', (el) => {
- el.focus()
- })
- <h1 v-color="color = 'red'">App 根组件</h1>
-
-
-
- app.directives ( 'color',(el,binding) => {
- el.style.color = binding.value
- })
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。