您好,登錄后才能下訂單哦!
slot-scope怎么在Vue中使用?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>組件之通過插槽(slot)分發內容</title> <script src="你的vue地址,請下載最新版的"></script> <script> Vue.component("test-slot",{ // 插槽允許有默認內容 template: `<div> <strong>Error!</strong> <slot></slot> </div> `, data:function () { return { name:"perry" } } }); // 具名插槽 Vue.component("slot-name",{ template: `<div> <header> <slot name="header"></slot> </header> <main> <slot ></slot> </main> <footer> <slot name="footer"></slot> </footer> </div> ` }); // 作用域插槽 Vue.component("todo-list",{ inheritAttrs:false, props:{ todos:[Array,Object] }, template: `<ul> <li v-for="todo in todos" :key="todo.id" > <slot :data="todo">{{todo.text}}</slot> </li> </ul> ` }); </script> <style> li{ list-style: none; display: inline-block; font-size: 25px; } </style> </head> <body> <div id="app"> <!--1、插槽內容 slot可以接收任何內容、代碼,包括組件--> <test-slot>Something bad happened.你是誰啊,我認識你嗎</test-slot> <test-slot> Something bad happened. <!--允許使用變量,但該變量必須是本作用域的才會生效,這里name的值將會是"岔道口"--> <h4>標題{{name}}</h4> <img src="img/flower.jfif" alt="圖片無法顯示"> </test-slot> <!--2、具名插槽 slo有一個特殊的屬性name,可以使插槽具名--> <slot-name> <h4>勸學</h4> <p>少壯不努力,老大徒傷悲</p> <p>光陰似箭,日月如梭</p> <template slot="header"> <ul > <li>主頁</li> <li>關于時間</li> <li>關于人生</li> <li>關于未來</li> </ul> </template> <p>你好啊</p> <p slot="footer"> <p>結尾</p> <p>粵ICP備6545646456415</p> </p> </slot-name> <!--使用作用域插槽,通過slot-scope實現--> <todo-list :todos="todos"> <template slot-scope="slotProps"> <span v-if="slotProps.data.isTrue">√</span> {{slotProps.data.text}} </template> </todo-list> <!--使用ES2015結構語法--> <todo-list :todos="todos"> <template slot-scope="{data}"> <span v-if="data.isTrue">√</span> {{data.text}} </template> </todo-list> </div> <script> new Vue({ el:"#app", data:{ name:"岔道口", todos:[ {text:"A",id:1,isTrue:true}, {text:"B",id:2,isTrue:true}, {text:"C",id:3,isTrue:false}, {text:"D",id:4,isTrue:true}, ], // slotProps:"" } }) </script> </body> </html>
例程中也寫了普通插槽和具名插槽,這個我就不說,我就說一下作用域插槽。首先從“作用域插槽“”這個名字說起,本來你父組件的模板是無法使用到子組件模板中的數據,官網中有一句特別強調的話:父組件模板的所有東西都會在父級作用域內編譯;子組件模板的所有東西都會在子級作用域內編譯。這句話其實挺難理解,舉個例子就知道了,
<test-slot> Something bad happened. <!--允許使用變量,但該變量必須是本作用域的才會生效,這里name的值將會是"岔道口"--> <h4>標題{{name}}</h4> <img src="img/flower.jfif" alt="圖片無法顯示"> </test-slot>
這是我上面的例子,也就是說這里name必須是當前組件里的,不能是test-slot這個組件內部的數據,這是它作用域限制,name這個數據屬于父組件的作用域,所以只能是父組件的數據。但是slot-scope的出現卻實現了父組件調用子組件內部的數據,子組件的數據通過slot-scope屬性傳遞到了父組件
// 作用域插槽 Vue.component("todo-list",{ inheritAttrs:false, props:{ todos:[Array,Object] }, template: `<ul> <li v-for="todo in todos" :key="todo.id" > //這里的:data=“todo”就是講子組件todo這個數據傳給了父組件 <slot :data="todo">{{todo.text}}</slot>//todo.text是默認值,父組件會把它覆蓋掉 </li> </ul> ` });
<!--使用作用域插槽,通過slot-scope實現--> <todo-list :todos="todos"> <template slot-scope="slotProps"> <span v-if="slotProps.data.isTrue">√</span> {{slotProps.data.text}} </template> </todo-list>
使用的時候就是這樣,從子組件傳過來的名為data值為todo的數據將會被slot-scope接收,需要注意的是,slot-scope接收的是一個對象,這里命名為slotProps,也就是說你傳過來的data將會作為slotProps的一個屬性,所以需要slotProps.data才能調用到data。前面說了,data的值為todo,todo是什么呢?todo是todos遍歷出來的,所以是一個對象。
new Vue({ el:"#app", data:{ name:"岔道口", todos:[ {text:"A",id:1,isTrue:true}, {text:"B",id:2,isTrue:true}, {text:"C",id:3,isTrue:false}, {text:"D",id:4,isTrue:true}, ], // slotProps:"" } });
看完上述內容,你們掌握slot-scope怎么在Vue中使用的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。