如何在Vue中使用更復雜的插槽

              小編:管理員 122閱讀 2022.08.18

              Vue.js是一個易于使用的Web應用程序框架,可用于開發交互式前端應用程序。

              在本文中,我將介紹命名插槽和作用域插槽。

              命名插槽

              有時我們的模板中會有多個插槽。為了區分每個插槽,我們必須給它們命名。

              我們可以使用name屬性定義具有命名插槽的組件,如下所示:

              Vue.component("layout", {  template: `    <div>      <header>            <slot name="header"></slot>      </header>      <main>              <slot></slot>      </main>      <footer>              <slot name="footer"></slot>      </footer>    </div>  `});
              復制

              然后我們可以將上述組件一起使用,如下所示:

              src/index.js:

              Vue.component("layout", {  template: `  <div>    <header>          <slot name="header"></slot>    </header>    <main>            <slot></slot>    </main>    <footer>            <slot name="footer"></slot>    </footer>  </div>  `});
              new Vue({  el: "#app"});
              復制

              index.html:

              <!DOCTYPE html><html>  <head>    <title>App</title>    <meta charset="UTF-8" />    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>  </head>  <body>    <div id="app">      <layout>        <template v-slot:header>          <h1>Header</h1>        </template>        <p>Main</p>        <template v-slot:footer>          <p>Footer</p>        </template>      </layout>    </div>    <script src="src/index.js"></script>  </body></html>
              復制

              填充具有header名稱的插槽:

              <template v-slot:header>   <h1>Header</h1></template>
              復制

              填充具有footer名稱的插槽:

              <template v-slot:footer>   <p>Footer</p></template>
              復制

              填充沒有名稱的插槽:

              <p>Main</p>
              復制

              我們還可以使用v-slot:default填充沒有名字的默認插槽,如下所示:

              <template v-slot:default>  <p>Main</p></template>
              復制

              無論哪種方式,渲染出來的HTML都是相同的。

              作用域插槽

              我們可以使用作用域插槽來訪問子組件中的數據。

              為了使子組件中的數據在父組件中可用,我們可以使用v-bind指令。

              一個簡單的示例,從父級去獲取子級組件數據如下:

              src/index.js:

              Vue.component("user", {  data() {    return {      user: {        firstName: "Joe",        lastName: "Smith"      }    };  },  template: `<p>    <slot v-bind:user="user"></slot>  </p>`});
              new Vue({  el: "#app"});
              復制

              index.html:

              <!DOCTYPE html><html>  <head>    <title>App</title>    <meta charset="UTF-8" />    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>  </head>  <body>    <div id="app">      <user>        <template v-slot:default="slotProps">          {{ slotProps.user.firstName }}        </template>      </user>    </div>    <script src="src/index.js"></script>  </body></html>
              復制

              在上面的代碼中,我們設置了子組件上的插槽數據:

              <p>   <slot v-bind:user="user"></slot></p>
              復制

              在根Vue實例中就可以使用user了。

              然后在根模板中,我們可以這樣使用user:

              <user>  <template v-slot:default="slotProps">    {{ slotProps.user.firstName }}  </template></user>
              復制

              通過slotProps訪問用戶的數據,slotProps可以訪問子組件中的v-bind提供的所有數據。

              單獨默認插槽的縮寫語法

              如果只有一個默認插槽,那么我們可以直接在子組件上使用v-slot:default或v-slot,如下所示:

              <user v-slot:default="slotProps">   {{
              復制
              <user v-slot="slotProps">   {{ slotProps.user.firstName }}</user>
              復制

              如果還有其他命名的插槽,則可能存在歧義,因此無法使用上述語法。

              如果我們有多個插槽,那么我們必須老老實實編寫如下內容:

              src/index.js:

              Vue.component("user", {  data() {    return {      user: {        firstName: "Joe",        lastName: "Smith"      }    };  },  template: `<p>    <slot v-bind:user="user" name='first-name'></slot>    <slot v-bind:user="user" name='last-name'></slot>  </p>`});
              new Vue({  el: "#app"});
              復制

              index.html:

              <!DOCTYPE html><html>  <head>    <title>App</title>    <meta charset="UTF-8" />    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>  </head>  <body>    <div id="app">      <user>        <template v-slot:first-name="slotProps">          {{ slotProps.user.firstName }}        </template>        <template v-slot:last-name="slotProps">          {{ slotProps.user.lastName }}        </template>      </user>    </div>    <script src="src/index.js"></script>  </body></html>
              復制

              在上面的代碼中,我們必須明確命名插槽,然后才能分別通過v-slot:first-name="slotProps"和v-slot:last-name="slotProps"訪問子組件的數據。

              另外,我們將插槽內容包裝在template中。

              解構作用域插槽數據

              我們可以使用解構賦值運算符來解構插槽作用域數據。

              例如,我們可以按以下方式使用它:

              src/index.js:

              Vue.component("user", {  data() {    return {      user: {        firstName: "Joe",        lastName: "Smith"      }    };  },  template: `<p>    <slot v-bind:user="user" name='first-name'></slot>    <slot v-bind:user="user" name='last-name'></slot>  </p>`});
              new Vue({  el: "#app"});
              復制

              index.html:

              <!DOCTYPE html><html>  <head>    <title>App</title>    <meta charset="UTF-8" />    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>  </head>  <body>    <div id="app">      <user>        <template v-slot:first-name="{ user }">          {{ user.firstName }}        </template>        <template v-slot:last-name="{ user }">          {{ user.lastName }}        </template>      </user>    </div>    <script src="src/index.js"></script>  </body></html>
              復制

              在上面的代碼中,我們沒有使用slotProps,而是將其更改為{ user }。{ user }與slotProps.user相同。

              最后

              我們可以使用命名插槽和作用域插槽創建多個插槽,并分別從父級的子級組件中去訪問數據。

              命名插槽可防止歧義,并允許我們使用多個插槽。

              另外,我們可以在子組件中使用v-bind,然后在組件中使用slotProps從父組件訪問子組件的數據。

              關聯標簽:
              秋霞久久老子无码午夜精品,欧洲av成本人在线观看免费,亚洲精品无码国模av