动态组件,插槽语法,自定义命令的使用

 一.我们一般用动态组件来干什么?

1.多个组件使用同一个挂载点,并动态切换,这就是动态组件

2.语法:

<component :is="变量"></component>

变量一般关联着要显示的组件,

3.  <keep-alive>     </keep-alive> 的作用

    在做动态切换的时候进行缓存,减轻浏览器的压力,不加的时候在页面中来回创建和销毁。

当加了<keep-alive>     </keep-alive>的时候

组件会被缓存起来不会进行销毁

4.activated ,deactivate钩子函数的作用

activated – 激活时触发

deactivated – 失去激活状态触发

在切换组件的时候,会循环使用这两个钩子函数,可在这两个函数里面挂载一些方法;

二.插槽语法

1.作用:用于实现组件的内容分发, 通过 slot 标签, 可以接收到写在组件标签内的内容

2.总共分为三大类

   默认插槽

   具名插槽

  作用域插槽

3.默认插槽的使用

   (1)  在子组件中通过 <slot></slot> 来接收

      (2)  在父组件里面自定义标签内 输入内容

   (3) 如果自定义标签内没有内容,默认显示插槽里面的内容(也就是<slot>内容</slot>)

   (4)如果里面有两个 <slot></slot> 来接收 则在自定义标签内的内容都会放入该<slot></slot>内。

4.具名插槽的使用

   (1) 具名 也就是有名字,有名字的好处是什么呢?我们来先说下没有名字的情况 ,如果没用名字,请看下面代码:

子组件:

<template>
  <div class>
    <h1>
      <slot></slot>
      <slot></slot>
      <slot></slot>
    </h1>
  </div>
</template>

<script>
export default {
  name: "",
  methods: {}
};
</script>

<style scoped>
</style>

父组件:

<template>
  <div class>
    <a1>
      66   
    </a1>
  </div>
</template>

<script>
import a1 from "../a1.vue";
export default {
  components: {
    a1
  },
  name: "",
  methods: {}
};
</script>

<style scoped>
</style>

 解析上面的代码:在自定义 <a1> 66</a1> 里面有数字,而对应的子组件有三个  <slot></slot>,   结果就是,在三个  <slot></slot>里面都是66,如果我像第一个  <slot></slot>显示55 第三个显示77,给对应的  <slot></slot>去上名字即可。

 父组件:

  <a1>
      <template v-slot:title1>55</template>
    </a1>
    <a1>
      <template v-slot:title2>66</template>
    </a1>
    <a1>
      <template v-slot:title3>77</template>
    </a1>

子组件:

      <slot name="title1"></slot>
      <slot name="title2"></slot>
      <slot name="title3"></slot>

通过取上属性的名字name="值", 通过v-slot="名字后面的一个值 。

5.作用域插槽的使用

1.作用域插槽的用处:让父组件决定子组件里面的数据该应该如何显示

2. 传递的方式,使用属性绑定的方式将数据传递给父组件

3.在父组件要使用template标签,在标签里面,使用v-slot的属性,属性值可以任意绑定

属性值是一个对象,对象里面包含了子组件传递过来的数据。

4.应用场景:使用组件插槽技术时,需要用到子组件内变量

5.使用的小技巧:通过双括号进行打印

6.当默认插槽与作用域插槽一起使用时,需要给作用域插槽起个名字

代码演示:

App.vue文件

<template>
  <div class="app">
    <!-- 1.第一次按照字符串的形式进行显示 -->
    <MyTable :arr="list"></MyTable>>
    <!-- 第二次点击跳转到图片 -->
    <MyTable :arr="list">
      <template v-slot="scope">
        <a :href="scope.data.headImgUrl">图片</a>
      </template>
    </MyTable>>
    <!-- 第三次动态绑定图片 -->
    <MyTable :arr="list">
      <template v-slot="scope">
        <img :src="scope.data.headImgUrl" alt />
      </template>
    </MyTable>>
  </div>
</template>

<script>
import MyTable from "../MyTable.vue";
export default {
  data() {
    return {
      list: [
        {
          name: "小传同学",
          age: 18,
          headImgUrl:
            "http://yun.itheima.com/Upload/./Images/20210303/603f2d2153241.jpg"
        },
        {
          name: "小黑同学",
          age: 25,
          headImgUrl:
            "http://yun.itheima.com/Upload/./Images/20210304/6040b101a18ef.jpg"
        },
        {
          name: "智慧同学",
          age: 21,
          headImgUrl:
            "http://yun.itheima.com/Upload/./Images/20210302/603e0142e535f.jpg"
        }
      ]
    };
  },
  name: "",
  methods: {},
  components: {
    MyTable
  }
};
</script>

<style scoped>
</style>

MyTable.vue

<template>
  <div>
    <table border="1">
      <thead>
        <tr>
          <th>序号</th>
          <th>姓名</th>
          <th>年龄</th>
          <th>头像</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="(obj, index) in arr" :key="index">
          <td>{
   
   { index + 1 }}</td>
          <td>{
   
   { obj.name }}</td>
          <td>{
   
   { obj.age }}</td>
          <td>
            <slot :data="obj">
              <!-- 默认值给上,如果使用组件不自定义标签显示默认文字 -->
              <!-- {
   
   { obj.headImgUrl}} -->
            </slot>
          </td>
        </tr>
      </tbody>
    </table>
  </div>
</template>

<script>
export default {
  props: {
    arr: Array
  }
};
</script>

解析:在显示地址栏的那一栏通过作用域插槽,分别以a链接跳转的方式,和img图片的形式,直接显示字符串的方式进行显示,通过  进行传递,在父组件里面进行接收,通过v-slot="变量",这个变量可以是任意的,可以通过进行答应这个变量来进行一层一层的剖析出底层的数据。

   

二.自定义指令

除了核心功能默认内置的指令 (v-modelv-show),Vue 也允许注册自定义指令。 v-xxx

html+css的复用的主要形式是组件

2.注册的方式总分为两种,全局注册和局部注册

  (1)全局注册在main.js里面进行注册,在所有的Vue文件里面都可以使用

   例子:

Vue.directive("指令的名字", {
  inserted(el) {
    el:获取的是操作的那个DOM标签
  }
})

( 2 ) 局部注册

directives:{
    "指令名字":{
        inserted(el){
            el拿到的是DOM中对应的标签
        }
        
    }
}

( 3)配置项可以说inserted  ,也可以是 bind 

操作js用inserted,操作css使用bind  

(4) 自定义命令传参

// 目标: 自定义指令传值
Vue.directive('color', {
  inserted(el, binding) {
    el.style.color = binding.value
  },
  update(el, binding) {
    el.style.color = binding.value
  }
})

<p v-color="colorStr" @click="changeColor">修改文字颜色</p>

<script>
  data() {
    return {
      theColor: "red",
    };
  },
  methods: {
    changeColor() {
      this.theColor = 'blue';
    },
  },
</script>

通过binding拿到的是一个对象,binding.value来进行修改里面的值。

おすすめ

転載: blog.csdn.net/qq_59076775/article/details/121043180