Vue 3 スロット、Xiaobi 2 番目の理解シリーズ

スロットの役割: 親コンポーネントが構造を子コンポーネントに渡す

スロット利用の2ステップ

最初のステップ: 子コンポーネントでスロットのデフォルト値を定義します。親コンポーネントが渡されない場合、デフォルトで表示されます。

ステップ 2: 親コンポーネントで構造体を渡します: <子コンポーネント>親コンポーネントが渡す必要がある構造体</子コンポーネント>

1. スロット匿名スロット

  1. サブコンポーネントのグッズ.vue
<template>
  <div class="son">
    <h3>我是子组件</h3>
    <h4>商品名称</h4>
    <!-- 插槽:可以让父组件决定这里放什么。 也可以设置默认值 -->
    <slot>我是默认值</slot>
  </div>
</template>
 
<script>
export default {
  name: "goods",
  data() {
    return {}
  }
}
</script>
 
<style scoped>
.son {
  border: 1px solid red;
}
</style>
  1. 親コンポーネント App.vue
<template>
  <div id="app">
    <h1>我是父组件</h1>
    <!-- 子组件1:插入购买链接 -->
    <goods>
      <button>
        <a href="http://www.jd.com">点击购买</a>
      </button>
    </goods>
    <!-- 子组件2:插入禁用点击的按钮 -->
    <goods>
      <button disabled>已卖完</button>
    </goods>
    <!-- 子组件3:没有插入内容,则显示默认插槽 -->
    <goods></goods>
  </div>
</template>
 
<script>
//导入局部组件
import goods from "./components/goods.vue"
export default {
  data() {
    return {}
  },
  components: {
    goods
  }
}
</script>
 
<style>
#app {
  border: 1px solid #000;
}
</style>

概要: 匿名スロットで使用されるスロットには「名前」がなく、親コンポーネントで渡されるすべての HTML 構造は予約なしで子コンポーネントのスロットに渡されます。

2. 名前付きスロット

名前付きスロットの構文:

1. サブコンポーネントに name 属性を追加します: name="スロット名"

  1. 親コンポーネントは v-slot: スロット名: を使用して、指定されたスロットに構造体を渡します。
  • 注: このv スロット命令はラベルに記述する必要があります。そうしないと、エラーが報告されます。
  • これは HTML5 の新しいセマンティック タグであり、テンプレートを意味します。タグ自体は表示されないため、ページ上では非表示になります。このタグは、空のボックス コンテナーである div に似ています。div との唯一の違いは、レンダリングされないことです。

名前付きスロット ロール: 親コンポーネントは複数の HTML 構造を子コンポーネントに渡します。

異なるコンテンツを異なるスロットに配信する

サブコンポーネント: cell.vue

<template>
  <div class="cell">
      <div class="title" >
          <slot name="a">我是标题</slot>
      </div>
      <div class="content" >
          <slot name="b">我是内容</slot>
      </div>
      <div class="right" >
          <slot name="c">我是图标</slot>
      </div>
  </div>
</template>
 
<script>
export default {
 
}
</script>
 
<style>
    .cell{
        border: 1px solid #f00;
        height: 60px;
        padding: 10px;
        position: relative;
    }
 
    .title{
        float: left;
        
    }
 
    .content{
        position: absolute;
        bottom: 10px;
        left: 10px;
    }
 
    .right{
        float: right;
    }
</style>

app.vue

 <template>
  <div id="app">
    <h1>我是父组件</h1>
    <cell>
        <template v-slot:a>
            <strong>我是h3</strong>
            <span>标题内容</span>
        </template>
        <template v-slot:b>
            <a href="#">我是链接</a>
        </template>
        <template #c>
            <button>我是按钮</button>
        </template>
    </cell>
  </div>
</template>
 
<script>
//导入局部组件
import cell from "./components/cell.vue"
export default {
  data() {
    return {}
  },
  components: {
    cell
  }
}
</script>
 
<style>
#app {
  border: 1px solid #000;
}
</style>

3. スコープスロット

スコープ付きスロットの構文は次のとおりです。

1. カスタム属性をサブコンポーネントに追加します: <slot: 属性名 = "属性値">

2. データを受信するために v-slot 属性を親コンポーネントに追加します。

親コンポーネントは、子コンポーネントの内部データ構文 (オブジェクト名.プロパティ名) を使用します。

スコープスロットの役割:

親コンポーネントが子コンポーネントにスロットを渡すと、子コンポーネント内のデータが使用できるようになります。

app.vue

<template>
  <div>
      <!-- 
      1.匿名插槽 : 父组件传递 一个html结构 给子组件 
        (1)子组件:  <slot> 插槽默认内容 </slot>
        (2)父组件:  <子组件> html结构 </子组件>
      2.具名插槽 : 父组件传递 多个html结构 给子组件
        (1)子组件: 给插槽添加一个name(插槽名)
          <slot name="插槽名"> 插槽默认内容  </slot>
        (2)父组件: 使用 v-slot:插槽名 或  #插槽名
          <子组件> 
            <template v-slot:插槽名>
                html结构
            </template>
          </子组件>
      3.作用域插槽: 子组件传递 数据 给父组件插槽
        (1)子组件 : 给<slot>内置组件添加自定义属性
          <slot 属性名="属性值" > 插槽默认内容 </slot>
        (2)父组件 : 使用 v-slot="对象名"
     -->
     <scope>
       <template v-slot="obj">
         <p>{
   
   { obj.a }}</p>
         <p>{
   
   { obj.b }}</p>
         <p>{
   
   { obj.c }}</p>
       </template>
     </scope>
  </div>
</template>
 
<script>
//导入局部组件
import scope from './components/scope.vue'
export default {
  //注册组件
  components: {
    scope
  },
  data() {
    return {
 
    }
  },
  
};
</script>
 
<style>
#app {
  border: 1px solid #000;
}
</style>

スコープ.vue

<template>
  <div class="box">
      <h2>学习作用域插槽</h2>
      <input v-model="msg" type="text" placeholder="输入搜索内容">
      <br>
      <!-- 定义插槽 -->
      <slot a="1" b="2" :c="msg"> 插槽默认内容 </slot>
  </div>
</template>
 
<script>
export default {
    data() {
        return {
           msg:''
        }
    },
}
</script>
 
<style scoped>
 
.box{
    border: 1px solid #000;
}
</style>

おすすめ

転載: blog.csdn.net/qq_52006046/article/details/128738874