本篇文章為大家展示了Vue中怎么實現(xiàn)組件化通訊,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

1. Vue的組成文件(.vue)
分為三部分,分別對應html,js,css
<template></template> <script></script> <style></style>
2. Vue的生命周期函數(shù)
beforeCreate() 創(chuàng)建數(shù)據(jù)之前
created() 創(chuàng)建數(shù)據(jù) 我們在這里的得到我們在data里面創(chuàng)建的數(shù)據(jù)
beforeMount() // Dom渲染完成前
mounted() //Dom渲染完成
beforeUpdate() // 更新視圖 在beforeUpdate觸發(fā)時,視圖已經更新完成
Updated() //更新數(shù)據(jù)調用的函數(shù)、。
<div id='app'>
<p>{{msg}}</p>
<input type='text' v-model='msg'>
</div>
var app = new Vue({
el: '#app',
data() {
return {
msg: 1
}
},
beforeCreate() {
console.log('beforeCreate', this.msg); //beforeCreate undefined
console.log('beforeCreate: ', document.getElementsByTagName('p')[0]) //beforeCreate <p>{{msg}}</p>
},
created() {
// 創(chuàng)建數(shù)據(jù)
console.log('created', this.msg); //beforeCreate 1
console.log('created: ', document.getElementsByTagName('p')[0]) //beforeCreate <p>{{msg}}</p>
// 異步處理得到渲染的dom數(shù)據(jù)
setTimeout(() => {
this.msg = 100
console.log('nextTick', document.getElementsByTagName('p')[0])
}, 100)
// nextTick <p>100</p>
},
beforeMount() {
console.log('beforeMount', this.msg) //beforeMount 1
console.log('beforeMount: ', document.getElementsByTagName('p')[0]) // beforeMount <p>{{msg}}</p>
},
mounted() {
// 渲染dom
console.log('mounted', this.msg) //mounted 1
console.log('mounted: ', document.getElementsByTagName('p')[0]) //mounted <p>1</p>
},
beforeUpdate() {
console.log('beforeUpdate', this.msg) //beforeUpdate 100
console.log('beforeUpdate: ', document.getElementsByTagName('p')[0]) //beforeUpdate <p>100</p>
},
updated() {
console.log('updated', this.msg) // updated 1
console.log('updated: ', document.getElementsByTagName('p')[0]) // updated <p>100</p>
}
})生命周期參考鏈接
3. export default
每一個模塊都是自己的作用域,相應的屬性來處理數(shù)據(jù)和函數(shù)
data(聲明數(shù)據(jù),可以是函數(shù)和屬性)
類型:Object | Function
組件只接受函數(shù)
// 對象的形式
export default{
data: {
a:1
}
}
// 函數(shù)的形式
export default{
data(){
return {
a: 1
}
}
}methods(一些指令和其他屬性的調用方法)
不要用箭頭函數(shù)來寫里面的函數(shù)
this指向Vue的實例
export default{
methods: {
plus() {
this.a++
}
}
}1、components (組件化定義)
類型: Object
自定義元素,增加代碼的復用性
// 當我們引用一個.vue文件的時候,就像使用這個文件來充當我們主體的一部分
<div>
<hello></hello>
</div>
import hello from './hello.vue'
export default {
components: {
hello
}
}2、computed(計算屬性)
計算屬性的結果會被緩存,依賴的數(shù)據(jù)發(fā)生變化才會重新渲染
注意計算屬性和methods,watch的區(qū)別
{{this.total}} //[3,4]
<button @click='add'>添加數(shù)據(jù)</button> //點擊會更新this.total
export default {
data: () => ({
a: 1,
b: [2,3]
}),
methods: {
add(){
this.b.push(8);
}
},
computed: {
total(){
return this.b.map((item)=>{
return item+this.a
})
}
}
}watch(監(jiān)聽對應的數(shù)據(jù))
鍵值對。鍵是我們需要監(jiān)督的數(shù)據(jù),值是相應的回調函數(shù)
回調函數(shù)接受2個參數(shù),新的值和舊的值(對于數(shù)組和對象不會出現(xiàn)舊值,對于簡單的數(shù)據(jù)會出現(xiàn)舊值)
監(jiān)聽對象的內部值變化,需要添加deep:true(數(shù)組不用)
// 點擊后相應的變化
data(){
return {
a: 1,
b: [2,4,6],
c:{name:'hcc',age:22}
}
},
methods: {
add(){
this.a++
this.b.push(8)
this.c.name = 'yx'
}
},
watch: {
b: function(val, oldVal){
console.log('new', val) //[2,4,6,8]
console.log('new', oldVal) //[2,4,6,8]
},
a: function(val, oldVal){
console.log(val); //2
console.log(oldVal); //1
},
c:{
handler(val){
console.log(val); //{name: 'yx',age: 22}
}
}
},props(用于接受父組件傳來的數(shù)據(jù))
規(guī)定和接受父組件的數(shù)據(jù)
單向數(shù)據(jù)流,子組件不能修改傳遞過來的數(shù)據(jù)
對象和數(shù)組是引用類型,指向同一個內存空間,如果 prop 是一個對象或數(shù)組,在子組件內部改變它會影響父組件的狀態(tài)。
可以規(guī)定接受的數(shù)據(jù)類型和默認值,如果是對象和數(shù)組,默認值導出是一個函數(shù)
// 父組件
<hello :formParent='num'></hello> //html
components: {
hello
},
data(){
return {
num: 3
}
}
//子組件
//1. 數(shù)組規(guī)定接受的數(shù)據(jù)
props: ['hello']
//2. 驗證的方式
props:{
hello: Number,
hello: [String, Number],
hello: {
type: Object,
default(){
return {message: 'hello'}
}
}
}v-on和v-emit(子組件向父元素傳遞數(shù)據(jù))
vm.$emit: 子元素向父元素定義訊號和傳遞數(shù)據(jù)
this.$emit('規(guī)定的訊號名稱', '想傳遞給父元素的數(shù)據(jù)')
vm.$on: 監(jiān)聽訊號,并觸發(fā)相應的函數(shù)(函數(shù)內部不用傳參)
@'規(guī)定的訊號名稱'='調用自己組件的方法并可以接受傳遞的參數(shù)'
// 子組件
data () {
return {
msg: 'Welcome to Your Vue.js App'
}
},
methods: {
change(){
this.$emit('sendMsg',this.msg) //把msg傳遞給父組件
}
}
// 父組件
// 引入子組件,并定義components
components: {
hello
},
methods: {
show(msg){ // 這里接受子組件傳遞的參數(shù)
console.log(msg);
}
}
<hello @sendMsg='show'></hello> // 這里不用傳遞參數(shù),不然會覆蓋子元素傳遞的參數(shù)ref(用來獲取dom和子組件)
可以用來操作dom<p ref="p">hello</p>
可以用來組件中的通訊
在組件中使用的this.refs是一個對象,包含了所有的綁定了的dom和子組件
// html
<h2 ref="myElement">這是一個dom元素</h2> //dom元素
<hello :propnum="propnum" :obj='d' @getson='getMsg' ref='child'></hello> // 子組件
>-- 組件中this.refs => {myElement: h2, child: VueComponent}
// 運用(在父元素中調用子元素的方法)
// html
<hello ref='child'></hello>
// 子元素hello
methods: {
change() {
this.$emit('getson',this.msg)
this.obj.name = 'yx'
},
drop(el) {
el.style.background = 'red';
}
},
// 父元素
methods: {
add() {
console.log(this.refs); //{child: VueComponent}
this.$refs.child.drop('這里傳遞父元素的dom節(jié)點')
}
}
//如果有一個需求是,一個父元素有2個子組件,其中一個子組件的方法要調用另一個子組件的dom元素
//1. 一個子組件需要向父組件發(fā)送元素this.$emit('方法名',dom)
//2. 父元素接受到子組件的傳遞得到對應dom
//3. 父元素通過this.$refs調用對應的另一個子組件的方法并傳入?yún)?shù)
// 子元素hello和world
<div class="world">
<h2 ref="world">這是world的dom元素</h2>
<button @click='send'>給父元素傳遞dom</button>
</div>
methods: {
send(){
this.$emit('give',this.$refs.world); //給父元素發(fā)送dom
}
<div class='hello'>
<button>改變dom</button>
</div>
methods: {
changeDom(target){
console.log(target)
}
}
// 父元素
<world @give='父親自己的方法'></world>
<hello ref='helloChild'></hello>
methods: {
// 這里接受子元素傳遞過來的dom元素
'父親自己的方法'(target) {
this.refs.helloChild.changeDom(target) //調用另一個子元素的方法,并把dom傳遞過去
}
}上述內容就是Vue中怎么實現(xiàn)組件化通訊,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注創(chuàng)新互聯(lián)網站建設公司行業(yè)資訊頻道。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)建站www.chinadenli.net,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
分享名稱:Vue中怎么實現(xiàn)組件化通訊-創(chuàng)新互聯(lián)
文章鏈接:http://www.chinadenli.net/article38/deehsp.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站排名、App設計、微信小程序、電子商務、ChatGPT、虛擬主機
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)