vue3.0-插槽、自定义指令

目录

1. ref引用

1)ref引用

2)使用ref引用DOM元素

3)使用ref引用组件实例

4)控制文本框和按钮的按需切换

5)让文本框自动获得焦点 

6)this.$nextTick(cb)方法 

2. 动态组件 

1)动态组件

2)实现动态组件渲染

3)使用keep-alive保持状态

3. 插槽 

1)插槽

2)插槽的基础用法

 ①没有预留插槽的内容会被丢弃

②后备内容

③具名插槽

④为具名插槽提供内容 

⑤具名插槽的简写形式 

3)作用域插槽

①解构作用域插槽的prop

②作用域插槽的应用场景

4. 自定义指令 

1)自定义指令

2)声明私有自定义指令的语法

3)声明全局自定义指令的语法

4)updated函数 

5)函数简写

6)指令的参数值 


1. ref引用

1)ref引用

ref用来辅助开发者在不依赖于jQuery的情况下,获取DOM元素或组件的引用。

每个vue的组件实例上,都包含一个$refs对象,里面存储着对应的DOM元素或组件的引用。默认情况下,组件的$refs指向一个空对象

结果为:

 

 

2)使用ref引用DOM元素

使用ref引用页面上的DOM元素,可以按照如下的方式进行操作:

结果为:

 

 

3)使用ref引用组件实例

4)控制文本框和按钮的按需切换

通过布尔值inputVisible来控制组件中的文本框与按钮的按需切换。

 

5)让文本框自动获得焦点 

 当文本框展示出来之后,如果希望它立即获得焦点,则可以为其添加ref引用,并调用原生DOM元素的.focus()方法即可。

 

6)this.$nextTick(cb)方法 

组件的$nextTick(cb)方法会把cb回调推迟到下一个DOM更新周期之后执行

等组件的DOM元素异步地重新渲染完成后,再执行cb回调函数,从而能保证cb回调函数可以操作到最新的DOM元素。 

 

2. 动态组件 

1)动态组件

动态组件指的是动态切换组件的显示与隐藏。vue提供了一个内置的<component>组件,专门用来实现组件的动态渲染。

  1. <component>:组件的占位符
  2. is属性:指定要渲染的组件名称
  3. <component is="要渲染的组件的名称"></component>

2)实现动态组件渲染

<template>
  <div>
    <h1>App根组件</h1>
    <button class="btn btn-primary" @click="comName = 'MyHome'">首页</button>
    <button class="btn btn-info" @click="comName = 'MyMovie'">电影</button>
    <hr>

    <!-- <my-home></my-home>
    <my-movie></my-movie> -->
    <component :is="comName"></component>
  </div>

</template>



data() {
    return {
      comName: MyHome
    }
  },
  components: {
    MyHome,
    MyMovie
  }

 

3)使用keep-alive保持状态

默认情况下,切换动态组件时无法保持组件的状态,此时可以使用vue内置的<keep-alive>组件保持动态组件的状态。

 

3. 插槽 

1)插槽

插槽(slot)是vue为组件的封装者提供的能力。允许开发者在封装组件时,把不确定的、希望由用户指定的部分定义为插槽。

可以把插槽认为是组件封装期间,为用户预留的内容的占位符

 

2)插槽的基础用法

在封装组件时,可以通过<slot>元素定义插槽,从而为用户预留内容占位符。

结果为: 

 

 ①没有预留插槽的内容会被丢弃

如果在封装组件时没有预留任何<slot>插槽,则用户提供的任何自定义内容都会被丢弃。

 

 

②后备内容

封装组件时,可以为预留的<slot>插槽提供的后备内容(默认内容)。如果组件的使用者没有为插槽提供任何内容,则后备内容会生效。

结果为:

 

③具名插槽

如果在封装组件时需要预留多个插槽节点,则需要为每个<slot>插槽制定具体的name名称,这种拥有名称的插槽叫做“具名插槽”。

如果没有指定name名称的插槽,会有隐含的名称:default

④为具名插槽提供内容 

在向具名插槽提供内容的时候,可以在<template>元素上使用v-slot指令,并以v-slot的参数的形式提供其名称。

    <my-atricle>
      <template v-slot:header>
        <h1>滕王阁序</h1>
      </template>
      <template v-slot:default>
        <p>豫章故郡,洪都新府。</p>
        <p>星分翼轸,地接衡庐</p>
        <p>襟三江而带五湖,控蛮荆而引瓯越。</p>
      </template>
      <template v-slot:footer>
        <p>落款:王勃</p>
      </template>
    </my-atricle>

结果为:

 

⑤具名插槽的简写形式 

把参数之前的所有内容(v-slot:)替换为字符#

    <my-atricle>
      <template #header>
        <h1>滕王阁序</h1>
      </template>
      <template #default>
        <p>豫章故郡,洪都新府。</p>
        <p>星分翼轸,地接衡庐</p>
        <p>襟三江而带五湖,控蛮荆而引瓯越。</p>
      </template>
      <template #footer>
        <p>落款:王勃</p>
      </template>
    </my-atricle>

3)作用域插槽

在封装组件的过程中,可以为预留的<slot>插槽绑定props数据,这种带有props数据的<slot>叫做作用域插槽。

<template>
  <div>
    <h3>Test组件</h3>
    <slot :info="information" :msg="message"></slot>
  </div>
</template>

<script>
export default {
  name: 'MyTest',
  data() {
    return {
      information: {
        username: 'zs',
        age: 20
      },
      message: '123'
    }
  }
}
</script>


    <my-test>
      <template #default="info">
        {{ info }}
      </template>
    </my-test>

结果为: 

①解构作用域插槽的prop

    <my-test>
      <template #default="{info, msg}">
        <p>{{ info.name }}</p>
        <p>{{ msg }}</p>
      </template>
    </my-test>

结果为:

 

②作用域插槽的应用场景

// Table.vue
<template>
  <table class="table table-bordered table-striped table-dark table-hover">
    <thead>
      <tr>
        <td>id</td>
        <td>name</td>
        <td>state</td>
      </tr>
    </thead>
    <tbody>
      <tr v-for="item in list" :key="item.id">
        <!-- <td>{{ item.id }}</td>
        <td>{{ item.name }}</td>
        <td>{{ item.state }}</td> -->
        <!-- 作用域插槽的自定义属性 -->
        <slot :user="item"></slot>
      </tr>
    </tbody>
  </table>
</template>

<script>
export default {
  name: 'MyTable',
  data() {
    return {
      list: [
        { id: 1, name: '张三', state: true },
        { id: 2, name: '李四', state: false },
        { id: 3, name: '王五', state: false },
      ]
    }
  }
}
</script>



// App.vue
    <my-table>
      <!--  解构作用域插槽的prop -->
      <template #default="{ user }">
        <td>{{ user.id }}</td>
        <td>{{ user.name }}</td>
        <!-- <td>{{ user.state }}</td> -->
        <td>
          <input type="checkbox" :checked="user.state">
        </td>
      </template>
    </my-table>

结果为:

 

4. 自定义指令 

1)自定义指令

vue官方提供了v-for、v-model、v-if等常用的内置指令,除此之外vue还允许开发者自定义指令

vue中的自定义指令分为两类,分别是:

  • 私有自定义指令
  • 全局自定义指令

2)声明私有自定义指令的语法

在每个vue组件中,可以在directives节点下声明私有自定义指令

<input type="text" class="form-control" v-focus>


directives: {
    // 声明私有自定义指令不用v-
    focus: {
      // 当被绑定的元素(这里是input)插入到DOM中,就会自动触发mounted()函数
      mounted(el) {
        el.focus()
      }
    }

结果为:

 

3)声明全局自定义指令的语法

全局共享的自定义指令需要通过单页面应用程序的实例对象进行声明。

4)updated函数 

mounted函数:只在元素第一次插入DOM时被调用,当DOM更新时mounted函数不会被触发。

updated函数:会在每次DOM更新完成后被调用

在vue2的项目中使用自定义指令时,mounted->bind,updated->updated

    <input type="text" class="form-control" v-focus>
    <!-- 当按下button,input输入框就会失去焦点 -->
    <!-- 解决方案:updated()函数,每次点击完按钮之后,输入框就会恢复自己的焦点 -->
    <button class="btn-primary" @click="count += 1">+1</button>


// 声明全局自定义指令
app.directive('focus', {
  mounted(el) {
    el.focus()
  },
  updated(el) {
    el.focus()
  }
})

5)函数简写

如果mounted和updated函数中的逻辑完全相同,则可以简写成:

6)指令的参数值 

在绑定指令时,可以通过等号的形式为指令绑定具体的参数值

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue3.0中的组件高级功能包括保持动态组件状态和引用DOM元素。 保持动态组件状态的方法是使用Vue内置的<keep-alive>组件。通过将动态组件包裹在<keep-alive>标签中,可以在切换动态组件时保持组件的状态。例如: ```html <keep-alive> <component :is="comName"></component> </keep-alive> ``` 在这个例子中,comName是一个data属性,用于指定当前要渲染的组件的名称。通过在<component>标签中使用:is属性,可以动态地指定要渲染的组件。 引用DOM元素的方法是使用ref属性。通过给DOM元素添加ref属性,可以在组件中通过$refs属性获取对DOM元素的引用。例如: ```html <template> <h3>MyRef组件</h3> <button @click="getRef">获取$refs引用</button> </template> <script> export default { methods: { getRef() { console.log(this.$refs) // $refs指向一个空对象,需要在DOM元素上添加ref属性 } } } </script> ``` 在这个例子中,点击按钮后,调用getRef方法可以在控制台上输出当前组件实例对象this。通过this.$refs可以访问到DOM元素的引用。 以上就是Vue3.0中组件高级功能的两个示例,分别是保持动态组件状态和引用DOM元素。希望能对你有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Vue3.0----组件高级【下】(第五章)](https://blog.csdn.net/QQ675396947/article/details/127486948)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值