作用域插槽
父組件對子組件加工處理
既可以複用子組件的slot,又可以使slot內容不一致
[mw_shl_code=applescript,true]<div id="app">
<!--
1、當我們希望li 的樣式由外部使用組件的地方定義,因爲可能有多種地方要使用該組件,
但樣式希望不一樣 這個時候我們需要使用作用域插槽
-->
<fruit-list :list='list'>
<!-- 2、 父組件中使用了<template>元素,而且包含scope="slotProps",
slotProps在這裏只是臨時變量
--->
<template slot-scope='slotProps'>
<strong v-if='slotProps.info.id==3' class="current">
{{slotProps.info.name}}
</strong>
<span v-else>{{slotProps.info.name}}</span>
</template>
</fruit-list>
</div>
<script type="text/javascript" src="js/vue.js"></script>
<script type="text/javascript">
/
作用域插槽
/
Vue.component('fruit-list', {
props: ['list'],
template: `
<div>
<li :key='item.id' v-for='item in list'>
3、 在子組件模板中,<slot>元素上有一個類似props傳遞數據給組件的寫法msg="xxx",
### 插槽可以提供一個默認內容,如果如果父組件沒有爲這個插槽提供了內容,會顯示默認的內容。
如果父組件爲這個插槽提供了內容,則默認的內容會被替換掉
<slot :info='item'>{{item.name}}</slot>
</li>
</div>
`
});
var vm = new Vue({
el: '#app',
data: {
list: [{
id: 1,
name: 'apple'
},{
id: 2,
name: 'orange'
},{
id: 3,
name: 'banana'
}]
}
});
</script>
</body>
</html>
[/mw_shl_code]
購物車案例1. 實現組件化佈局
把靜態頁面轉換成組件化模式
把組件渲染到頁面上
[mw_shl_code=applescript,true]<div id="app">
<div class="container">
<!-- 2、把組件渲染到頁面上 -->
<my-cart></my-cart>
</div>
</div>
<script type="text/javascript" src="js/vue.js"></script>
<script type="text/javascript">
1、 把靜態頁面轉換成組件化模式
# 1.1 標題組件
var CartTitle = {
template: `
<div class="title">我的商品</div>
`
}
# 1.2 商品列表組件
var CartList = {
# 注意點 : 組件模板必須是單個根元素
template: `
<div>
<div class="item">
<img src="img/a.jpg"/>
<div class="name"></div>
<div class="change">
<a href="">-</a>
<input type="text" class="num" />
<a href="">+</a>
</div>
<div class="del">×</div>
</div>
<div class="item">
<img src="img/b.jpg"/>
<div class="name"></div>
<div class="change">
<a href="">-</a>
<input type="text" class="num" />
<a href="">+</a>
</div>
<div class="del">×</div>
</div>
<div class="item">
<img src="img/c.jpg"/>
<div class="name"></div>
<div class="change">
<a href="">-</a>
<input type="text" class="num" />
<a href="">+</a>
</div>
<div class="del">×</div>
</div>
<div class="item">
<img src="img/d.jpg"/>
<div class="name"></div>
<div class="change">
<a href="">-</a>
<input type="text" class="num" />
<a href="">+</a>
</div>
<div class="del">×</div>
</div>
<div class="item">
<img src="img/e.jpg"/>
<div class="name"></div>
<div class="change">
<a href="">-</a>
<input type="text" class="num" />
<a href="">+</a>
</div>
<div class="del">×</div>
</div>
</div>
`
}
# 1.3 商品結算組件
var CartTotal = {
template: `
<div class="total">
<span>總價:123</span>
<button>結算</button>
</div>
`
}
## 1.4 定義一個全局組件 my-cart
Vue.component('my-cart',{
## 1.6 引入子組件
template: `
<div class='cart'>
<cart-title></cart-title>
<cart-list></cart-list>
<cart-total></cart-total>
</div>
`,
# 1.5 註冊子組件
components: {
'cart-title': CartTitle,
'cart-list': CartList,
'cart-total': CartTotal
}
});
var vm = new Vue({
el: '#app',
data: {
}
});
</script>
[/mw_shl_code]