日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > vue >内容正文

vue

Vue第二部分(2):组件的嵌套与通信

發(fā)布時間:2025/3/15 vue 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Vue第二部分(2):组件的嵌套与通信 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

組件的嵌套

在Vue的設(shè)計中,一切都可以看作組件。整個頁面可以看作是一個根組件,內(nèi)部的各塊組件可以看作子組件。組件之間自然的會發(fā)生嵌套關(guān)系。

接下來,我們看一下組件嵌套的示例:

<div id="app"><my-table></my-table> </div><template id="table-head"><thead><tr><th>id</th><th>name</th><th>age</th><th>gender</th></tr></thead> </template><template id="table-body"><tbody><tr v-for="u in users" :key="u.id"><td>{{u.id}}</td><td>{{u.name}}</td><td>{{u.age}}</td><td>{{u.gender}}</td></tr></tbody> </template><template id="my-table"><table border="1" align="center"><thead is="table-head"></thead><tbody is="table-body"></tbody></table> </template> <script>var tableHead = {template:"#table-head"}var tableBody = {template:"#table-body",data:function(){return {users: [{"id":1, "name": "小明", "age": 13, "gender": "男"},{"id":2, "name": "小紅", "age": 13, "gender": "女"},{"id":3, "name": "小綠", "age": 4, "gender": "男"}]}}}//使用局部注冊,需要將子組件注冊到父組件中var myTable ={template:"#my-table",components:{"table-head":tableHead,"table-body":tableBody}}const vm = new Vue({el:"#app",components:{"my-table":myTable}}); </script>

說明:事實上,雖然 new Vue() 沒有顯式的使用組件的語法,但它本質(zhì)上也是一個父組件。

組件通信

通常一個較為復(fù)雜的頁面,一定會出現(xiàn)組件的嵌套。各個組件之間以嵌套的關(guān)系組合在一起,那么這個時候不可避免的會有組件間通信的需求。

1. 父傳子:props

通常父組件的模板中包含子組件,父組件要正向地向子組件傳遞數(shù)據(jù)或參數(shù),子組件接收到后根據(jù)參數(shù)的不同來渲染不同的內(nèi)容或執(zhí)行操作。這個正向傳遞數(shù)據(jù)的過程就是通過props來實現(xiàn)的。

比如在之前的表格案例中,table-body子組件展示的數(shù)據(jù)是定義在子組件自個身上的,這么做雖有效果,但降低了該組件的復(fù)用價值,更好的做法:子組件中不定義數(shù)據(jù),而是由使用它的父組件傳遞。此時,需要使用 props完成父組件向子組件的數(shù)據(jù)傳遞。

語法:
//1.定義子組件中添加props屬性
const 組件 = {
template:“html片段”,
props:[“自定義參數(shù)名”,…]
}
//2 使用組件時,為組件添加 自定義參數(shù)名 同名的屬性
<組件 :自定義參數(shù)名=”值"></組件>

例子:

<div id="app"><my-table :us="users"></my-table> </div><template id="my-table"><table border="1" align="center"><thead><tr><th>id</th><th>name</th><th>age</th><th>gender</th></tr></thead><tbody><tr v-for="u in us" :key="u.id"><td>{{u.id}}</td><td>{{u.name}}</td><td>{{u.age}}</td><td>{{u.gender}}</td></tr></tbody></table></template><script>var myTable = {template:"#my-table",props:["us"]}const vm = new Vue({el:"#app",data:{users: [{"id":1, "name": "小明", "age": 13, "gender": "男"},{"id":2, "name": "小紅", "age": 13, "gender": "女"},{"id":3, "name": "小綠", "age": 4, "gender": "男"}]},components:{"myTable":myTable}}); </script>

2. 子傳父:$emit

父組件的模板中包含子組件,那么經(jīng)常會出現(xiàn)子組件的狀態(tài)發(fā)生變化時,要通知到父組件。所有的 prop 都使得其父子 prop 之間形成了一個單向下行綁定:父級 prop 的更新會向下流動到子組件中,但是反過來則不行。如下所示:

代碼如下:

<div id="app"><h2>{{num}}</h2><!-- 父組件向子組件傳遞數(shù)據(jù) count=num 子組件中修改count值,不能修改父組件的num --><counter :count="num"></counter> </div><script>Vue.component("counter",{template:` <div> <button @click="increment">點我自增</button> <span>{{count}}</span> <button @click="decrement">點我自減</button></div>`,props:["count"],methods:{increment(){this.count++;},decrement(){this.count--;}}})const vm = new Vue({el:"#app",data:{num:0}}) </script>

所以,當需要子傳父的時候,Vue采用事件放射的方式完成。

  • 在子組件中執(zhí)行 $emit(“父組件的自定義事件”)通知父組件,并發(fā)送數(shù)據(jù)
  • 父組件中定義自定義事件處理函數(shù),并接收數(shù)據(jù)
<div id="app"><h2>{{num}}</h2><!-- 2 綁定自定義事件處理函數(shù),監(jiān)聽子組件的事件觸發(fā) change-count當子組件觸發(fā)事件后,執(zhí)行handleChange事件處理函數(shù),$emit發(fā)送的數(shù)據(jù)將成為handleChange的實參--><counter :count="num" @change-count="handleChange"></counter> </div><script>Vue.component("counter",{template:`<div><button @click="increment">點我自增</button><span>{{count}}</span><button @click="decrement">點我自減</button></div>`,props:["count"],methods:{increment(){this.count++;//1 子組件中通過$emit觸發(fā)父組件中的自定義事件,并發(fā)送數(shù)據(jù)this.$emit("change-count",this.count);},decrement(){this.count--;//1 子組件中通過$emit觸發(fā)父組件中的自定義事件,并發(fā)送數(shù)據(jù)this.$emit("change-count",this.count);}}})const vm = new Vue({el:"#app",data:{num:0},methods:{handleChange(value){this.num = value;}}}) </script>

實戰(zhàn)案例

代碼如下:

<div id="app"><div><my-table :us="users" @show-user="handleShowUser"></my-table><hr><update-form :u="user" @update-user="handleUpdateUser"></update-form></div> </div> <template id="my-table"><table border="1"><thead><tr><th>id</th><th>name</th><th>age</th><th>operation</th></tr></thead><tbody><tr v-for="(u,index) in us" :key="u.id"><td>{{u.id}}</td><td>{{u.name}}</td><td>{{u.age}}</td><td><button @click="emitShowUser(u)">更新</button></td></tr></tbody></table> </template> <template id="update-form"><form action="" @submit.prevent="emitUpdateUser"><input type="hidden" v-model="u.id" >用戶名: <input type="text" v-model="u.name"> <br>年齡: <input type="number" v-model="u.age"> <br><input type="submit" value="更新"></form> </template><script>const updateForm = {template:"#update-form",props:["u"],methods:{emitUpdateUser(){this.$emit("update-user",this.u);}}};const myTable = {template:"#my-table",props:["us"],methods:{emitShowUser(u){this.$emit("show-user",u);}}};const vm = new Vue({el:"#app",data:{users:[{id:1,name:"xiao1hei",age:18},{id:2,name:"xiao2hei",age:20},{id:3,name:"xiao3hei",age:22}],user:{}},components:{myTable,updateForm},methods:{handleShowUser(u){this.user = JSON.parse(JSON.stringify(u));},handleUpdateUser(u){this.users.forEach((item,i,users)=>{if(item.id == u.id){//由于Vue2.x無法直接檢測到數(shù)組中元素的變化,可以使用vue提供的$set方法this.$set(this.users,i,JSON.parse(JSON.stringify(u))g);}})}}}) </script>

總結(jié)

以上是生活随笔為你收集整理的Vue第二部分(2):组件的嵌套与通信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产美女裸体无遮挡免费视频 | 亚洲国产欧美视频 | 日韩www.| 韩国无码一区二区三区精品 | 丁香花高清在线 | 中文字幕天堂av | 国产精品扒开腿做爽爽爽a片唱戏 | 清纯唯美第一页 | av成人亚洲 | 亚洲毛片在线免费观看 | 国产精品白嫩白嫩大学美女 | 久久精品999 | 久久久久久国产精品无码 | 国产最新视频在线 | 日韩成人一区二区三区 | 国产精品美女久久久 | av在线不卡网站 | 日韩av男人的天堂 | 中文字幕人成乱码熟女香港 | 淫五月| 欧美做爰啪啪xxxⅹ性 | 午夜国产福利视频 | 9色在线视频 | 亚洲精品国产精品国自产 | 国产99久久久 | 在线综合网 | 殴美一级黄色片 | 中文字幕在线1 | 九九热精品视频在线观看 | 麻豆精品在线视频 | www.黄色小说.com | 久久久久久久9999 | 日韩精品123 | 看黄色一级视频 | 毛片视频播放 | 亚洲一区二区激情 | 亚洲国产成人精品一区二区三区 | 四虎永久在线精品 | 国产乱轮视频 | 欧美偷拍第一页 | 天天舔天天干天天操 | 日本一区二区在线播放 | 男人的天堂毛片 | 日韩特一级| 久久久久人妻一区精品色 | 国产又黄又粗的视频 | 中文字幕日本人妻久久久免费 | missav | 免费高清av在线看 | 午夜精品久久久 | 在线a毛片 | 国产福利免费看 | 视色在线 | 国产一区二区三区免费播放 | 成人永久免费视频 | jizz俄罗斯 | 日韩精品一区二区三区视频在线观看 | 亚洲伦理影院 | 自拍偷拍在线视频 | 欧洲亚洲综合 | 西西人体做爰大胆gogo | 午夜国产一区二区三区 | 中文字幕在线视频免费 | 四虎影视精品 | 五月婷婷狠狠爱 | 成人毛片18女人 | 神马久久网站 | 亚洲高清不卡 | 色妞色视频一区二区三区四区 | 国产色片| 免费黄网站在线观看 | 九九久久国产 | 91在线观看网站 | 国产高清无密码一区二区三区 | 嫩草影院在线观看视频 | 精品热 | 日韩成人免费av | 国产人妖在线播放 | 免费成人在线观看 | 古装做爰无遮挡三级 | 97在线公开视频 | 日韩av三区| 亚洲人 女学生 打屁股 得到 | av有声小说一区二区三区 | 无码 制服 丝袜 国产 另类 | 色站综合| 国产日韩精品一区二区 | 国产欧美一区二区三区视频在线观看 | 成人午夜视频免费观看 | 久久www视频| www.18av | 青青草一区 | 香蕉视频网页 | 最近中文字幕一区二区 | 国产第一页在线观看 | а√天堂资源官网在线资源 | 久久精品人人爽 | 色老久久| 精品人妻一区二区三区免费看 | 天堂一区在线观看 |