插槽——vue组件开发(四)

前言

插槽是组件式开发最常用的技术。所谓的插槽(slot)是组件中的一块HTML模板,这块模板显示不显示以及怎样显示由父组件来决定,但槽显示的位置确由子组件自身决定。slot写在组件template的哪块,父组件传过来的模板将来就显示在哪块。如:开发一个人员简历显示组件,显示的方式由子组件来决定,显示内容是由调用此组件的父组件决定。插槽分为匿名插槽、具名插槽和作用插槽三类

匿名插槽

匿名插槽就是不用设置name属性的插槽,父组件使用时无需指定名称即可获取指定的位置。如果子组件只有一个插槽,无需指定子组件插槽名称一个子组件只能有一个匿名插槽。
定义一个组件,预留一个插槽,示例如下:
子组件名称为v-slot

<template>  
   <div>  
     <p class="child">  
	    <h3>这里是子组件</h3>  
	    <slot></slot>  //预留一个插槽位置,无需给名称
     </p>  
    </div>  
</template>  

父组件使用

<template>  
  <div>  
    <p class="father">  
      <h3>这里是父组件</h3>  
      <v-slot><h1>这是父组件的信息</h1></v-slot>
      //v-slot为子插槽实例名,<h1>为父组件中的html片段  
  </div>  
</template>

具名插槽

具名插槽是相对匿名插槽而言,插槽具有具体的名字。当一个子组件中有多个插槽时,就必须使用具名插槽,以便父组件确定插入html片段的位置。具名插槽可以在一个组件中出现多次,不同的名字决定不同的位置。子组件代码如下

<template>
  <div>
    <span>版权所有@</span>
    <slot name='company-name'></slot>
    <slot></slot>
      <slot name='internet-tandard-ublish-umber'></slot>
  </div>
</template>

<script>
export default {
  name: 'footer-slot'
}

这个组件有两个插槽,只有给定插槽的名字,父组件才知道具体html代码片段填到何处,父组件使用代码如下

<template>
  <div id="app">
    <name-slot>2012-2022
      <template v-solt:company-name>
        <span>宝鸡文理学院</span>
      </template>

      <template v-solt:internet-tandard-ublish-umber>
        <span>京公网安备 110023002002005号</span>
      </template>
    </name-slot>
  </div>
</template>

<script>
import nameSlot from './components/slot-name'
export default {
  name: 'App',
  components: {
    nameSlot
  }
}
</script>

父组件调用时,具名插槽使用语法为:v-slot:插槽名称,而且要跟template标签一起使用。

作用插槽

作用插槽也称带数据的插槽,使用作用插槽可以使用父组件定义的样式,显示子组件绑定的内容。在使用插槽时,父组件在插槽中需要使用到子组件中的数据,这时就需要使用到作用插槽。在子组件用绑定属性的方式传递数据,代码如下:

	<template>  
	  <div>  
	    <p class="child">  
	      <h3>这里是子组件</h3>  
	      <slot  name="up" :data="student"></slot>  //插槽中绑定一个子组件的数据
	    </p>  
	  </div>  
	</template>  
 <script>  
  export default {  
    name: 'v-slot',  
    data() {  
      return {  
        student:{ name:"张三",
                  age: 28 }  
      }  
    }  
  }  
</script> 

父组件代码为:

<template>
  <div>
    <v-slot>
      <template slot-scope="item">{{item.name}}</template>
    </v-slot>
  </div>
</template>

这里使用slot-scope接收子组件传递的数据,item父组件变量,用于对子组件数据的接收。在作用插槽中父组件只关注样式,子组件提供数据。在Element UI Table 的 slot-scope的使用,在列表页面中Element UI Table是子组件,父组件通过props将数据传入后,Element UI Table将数据封装包含row、index等组件内部的数据,父组件需要获取这种子组件的数据,进行格式化操作,就需要使用slot-scope将数据接收。如:

      <el-table-column header-align="center" width="120" align="center" label="部门状态">
        <template slot-scope="scope">
          <el-button v-if="scope.row.sflag=='1'" type="danger" size="mini" round @click="changeStatus(scope.row)">
          </el-button>
          <el-button v-if="scope.row.sflag=='0'" type="success" size="mini" round @click="changeStatus(scope.row)">
          </el-button>
        </template>
      </el-table-column>

这里使用slot-scope将子组件中的data信息接收过来,根据flag所在行的flag的值确定使用什么样色来表示。

小结

插槽是vue组件开发中最常用方式之一。匿名和具名插槽很容易理解,子组件提供位置,父组件提供数据和样式,作用域插槽不容易理解,在这里父组件提供样式,子组件提供数据。

组件Vue.js 中最重要的概念之一。组件可以让我们将 UI 拆分为独立、可复用的部件,使得代码更加清晰、易于维护。在 Vue.js 中,组件可以分为全局组件和局部组件,其中全局组件可在任何地方使用,而局部组件只能在其组件中使用。 定义组件时,需要使用 Vue.component() 方法,该方法需要传入两个参数:组件名称和组件配置对象。组件名称应该采用 kebab-case(短横线分隔命名)格式,以便在 HTML 中使用。 示例代码如下: ```javascript // 定义一个名为 button-counter 的新组件 Vue.component('button-counter', { data: function () { return { count: 0 } }, template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>' }) ``` 在上述代码中,我们定义了一个名为 button-counter 的组件,该组件包含一个计数器,每次点击按钮计数器加一。 在 HTML 中使用组件时,需要使用组件名称作为自定义标签来调用组件。示例代码如下: ```html <div id="app"> <button-counter></button-counter> </div> ``` 在上述代码中,我们调用了 button-counter 组件,并将其渲染到了 id 为 app 的 div 元素中。 除了组件的 data 和 template 属性外,还可以使用 props 属性来传递组件之间的数据。使用 props 时,需要在组件的配置对象中定义 props 属性,并在 HTML 中使用 v-bind 指令来传递数据。 示例代码如下: ```javascript // 定义一个名为 todo-item 的新组件 Vue.component('todo-item', { props: ['todo'], template: '<li>{{ todo.text }}</li>' }) // 创建一个 Vue 实例 var app = new Vue({ el: '#app', data: { groceryList: [ { id: 0, text: '蔬菜' }, { id: 1, text: '水果' }, { id: 2, text: '奶酪' } ] } }) ``` 在上述代码中,我们定义了一个名为 todo-item 的组件,并使用 props 属性定义了一个名为 todo 的 prop。在 HTML 中,我们使用 v-bind 指令将 groceryList 数组中的每个对象传递给了 todo-item 组件。示例代码如下: ```html <div id="app"> <ul> <todo-item v-for="item in groceryList" v-bind:todo="item" v-bind:key="item.id"></todo-item> </ul> </div> ``` 在上述代码中,我们使用 v-for 指令遍历 groceryList 数组,并使用 v-bind 指令将数组中的每个对象传递给了 todo-item 组件。注意,我们还需要使用 v-bind:key 指令来为每个列表项指定一个唯一的 key 值。 插槽Vue.js 中另一个重要的概念。插槽可以让组件在子组件中插入任意的 HTML 内容,使得组件更加灵活、可复用。 在子组件中,使用 <slot> 标签来定义插槽。在组件中,使用子组件的自定义标签来调用组件,并在标签内部插入 HTML 内容。示例代码如下: ```javascript // 定义一个名为 alert-box 的新组件 Vue.component('alert-box', { template: ` <div class="alert-box"> <strong>Error!</strong> <slot></slot> </div> ` }) // 创建一个 Vue 实例 var app = new Vue({ el: '#app' }) ``` 在上述代码中,我们定义了一个名为 alert-box 的组件,并在组件中定义了一个插槽。在 HTML 中,我们调用了 alert-box 组件,并在标签内部插入了一些 HTML 内容。示例代码如下: ```html <div id="app"> <alert-box> <p>Something bad happened.</p> </alert-box> </div> ``` 在上述代码中,我们调用了 alert-box 组件,并在标签内部插入了一些 HTML 内容。该 HTML 内容会被插入到 alert-box 组件插槽中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值