热点
模块化思维实战:后端站长从0到1构建高效网站,reasoning_content:我们要求以后端站长的口吻,写一个与“技术、科技”相关,关于[从0到1:运用模块化思维与实战技巧,轻松构建高效网站]的标题需要简短精炼,30字以内直接输出标题,不要加说明nn可以考虑:后端站长视角,强调模块化思维和实战技巧,从0到1构建高效网站可能的从0到1:后端站长教你模块化构建高效网站 但字数可能超?数一下:从0到1:后端站长教你模块化构建高效网站 —— 共18个字符(包括标点)?汉字每个算一个字,冒号、空格?严格来说:从0到1:后端站长教你模块化构建高效网站 共16个字(从0到1:后端站长教你模块化构建高效网站,数一下:从0到1:(3个汉字+1个冒号?不,是从0到1是4个字符,但通常算4个?我们按汉字+符号更好的:去掉一些词nn模块化思维实战:后端站长从0到1建高效站 数一下:模块化思维实战:后端站长从0到1建高效站 —— 共18个?模块化思维实战(6字)冒号(1)后端站长(4)从0到1(4)建高效站(4)总19?有点多nn更简洁:模块化构建高效网站:后端站长的从0到1 共14个字?模块化构建高效网站:后端站长的从0到1 —— 13个汉字+1冒号+1数字?其实从0到1是4个字符可以nn或者:后端站长:模块化思维从0到1打造高效网站 共16字?后端站长:模块化思维从0到1打造高效网站 —— 数:后(1)端(2)站(3)长(4):(5)模(6)块(7)化(8)思(9)维(10)从(11)0(12)到(13)1(14)打(15)造(16)高(17)效(18)网(19)站(20) —— 20字,超了nn要控制在30字以内,所以20字以内都行但最好更精炼nn考虑直接用原话中的从0到1和模块化思维、实战技巧、高效网站但题目要求以后端站长口吻,所以可以加上后端站长nn思路:从0到1:后端站长的模块化实战,高效网站轻松建 数一下:从0到1:后端站长的模块化实战,高效网站轻松建 —— 从0到1(4)冒号(1)后端站长(4)的(1)模块化实战(5)逗号(1)高效网站(4)轻松建(3)总共4+1+4+1+5+1+4+3=23字可以nn更简洁:模块化思维实战:后端站长从0到1建高效站 前面数过19字nn或者:后端站长带你从0到1模块化构建高效网站 15字nn注意:要求与技术、科技相关,但标题本身已经涉及nn我会选择:后端站长:模块化思维从0到1轻松构建高效网站 数:后(1)端(2)站(3)长(4):(5)模(6)块(7)化(8)思(9)维(10)从(11)0(12)到(13)1(14)轻(15)松(16)构(17)建(18)高(19)效(20)网(21)站(22) —— 22字可以nn另一个:从0到1:后端站长模块化实战构建高效网站 22字左右nn为了更口语化:从0到1轻松建站:后端站长教你模块化实战 15字?从0到1轻松建站:后端站长教你模块化实战 —— 共18字?nn我最后决定用:从0到1:模块化+实战,后端站长教你轻松建高效站 数:从0到1:模块化+实战,后端站长教你轻松建高效站 —— 共?从(1)0(2)到(3)1(4):(5)模(6)块(7)化(8)+(9)实(10)战(11),(12)后(13)端(14)站(15)长(16)教(17)你(18)轻(19)松(20)建(21)高(22)效(23)站(24) —— 24字略长去掉教你变成从0到1:模块化+实战,后端站长轻松建高效站 22字nn或者直接:模块化思维实战:后端站长从0到1构建高效网站 18字?数一下:模(1)块(2)化(3)思(4)维(5)实(6)战(7):(8)后(9)端(10)站(11)长(12)从(13)0(14)到(15)1(16)构(17)建(18)高(19)效(20)网(21)站(22) —— 22字还是22nn我认为22字完全在30字以内可以输出这个nn注意:不要加任何说明直接输出标题
15 9 月 2026, 周二

副标题#e#

对于vue来说,组件是非常常见的,有很多平台都封装了了属于自己一套的组件,如element ui、we ui等等。同时组件之间的消息传递也是非常重要的,下面是我对组件之间消息传递的各种方式的总结,共有8种方式。如有不足之处,可以留言补充,互相学习。

vue

1. props和$emit

这是最最常用的父子组件通信方式,父组件向子组件传递数据是通过prop传递的,子组件传递数据给父组件是通过$emit触发事件来做到的。 实例:

父组件

  1. Vue.component('parent',{ 
  2.  template:` 
  3.  <div> 
  4.  <p>父组件</p> 
  5.  <child :message="message" v-on:getChildData="getChildData"></child> 
  6.  </div> 
  7.  `, 
  8.  data(){ 
  9.  return { 
  10.  message:'Hello web秀' 
  11.  } 
  12.  }, 
  13.  methods:{ 
  14.  //执行子组件触发的事件 
  15.  getChildData(val){ 
  16.  console.log(val) 
  17.  } 
  18.  } 
  19. }) 
  20. var app=new Vue({ 
  21.  el:'#app', 
  22.  template:` 
  23.  <div> 
  24.  <parent></parent> 
  25.  </div> 
  26.  ` 
  27. }) 

子组件

  1. Vue.component('child',{ 
  2.  //得到父组件传递过来的数据 
  3.  props:['message'], 
  4.  data(){ 
  5.  return { 
  6.  myMessage: this.message 
  7.  } 
  8.  }, 
  9.  template:` 
  10.  <div> 
  11.  <input type="text" v-model="myMessage" @input="passData(myMessage)">  
  12.  </div> 
  13.  `, 
  14.  methods:{ 
  15.  passData(val){ 
  16.  //触发父组件中的事件 
  17.  this.$emit('getChildData',val) 
  18.  } 
  19.  } 
  20. }) 

解析:

  • 父组件传递了message数据给子组件,并且通过v-on绑定了一个getChildData事件来监听子组件的触发事件;
  • 子组件通过props得到相关的message数据,最后通过this.$emit触发了getChildData事件。

2. $attrs和$listeners

第一种方式处理父子组件之间的数据传输有一个问题:如果多层嵌套,父组件A下面有子组件B,组件B下面有组件C,这时如果组件A想传递数据给组件C怎么办呢?

如果采用第一种方法,我们必须让组件A通过prop传递消息给组件B,组件B在通过prop传递消息给组件C;要是组件A和组件C之间有更多的组件,那采用这种方式就很复杂了。从Vue 2.4开始,提供了$attrs和$listeners来解决这个问题,能够让组件A之间传递消息给组件C。

C组件

  1. Vue.component('C',{ 
  2.  template:` 
  3.  <div> 
  4.  <input type="text" v-model="$attrs.messageC" @input="passCData($attrs.messageC)"> 
  5.  </div> 
  6.  `, 
  7.  methods:{ 
  8.  passCData(val){ 
  9.  //触发父组件A中的事件 
  10.  this.$emit('getCData',val) 
  11.  } 
  12.  } 
  13. }) 

B组件

  1. Vue.component('B',{ 
  2.  data(){ 
  3.  return { 
  4.  myMessage:this.message 
  5.  } 
  6.  }, 
  7.  template:` 
  8.  <div> 
  9.  <input type="text" v-model="myMessage" @input="passData(myMessage)"> 
  10.  <C v-bind="$attrs" v-on="$listeners"></C> 
  11.  </div> 
  12.  `, 
  13.  //得到父组件传递过来的数据 
  14.  props:['message'], 
  15.  methods:{ 
  16.  passData(val){ 
  17.  //触发父组件中的事件 
  18.  this.$emit('getChildData',val) 
  19.  } 
  20.  } 
  21. }) 

A组件

  1. Vue.component('A',{ 
  2.  template:` 
  3.  <div> 
  4.  <p>this is parent compoent!</p> 
  5.  <B  
  6.  :messageC="messageC"  
  7.  :message="message"  
  8.  v-on:getCData="getCData"  
  9.  v-on:getChildData="getChildData(message)"> 
  10.  </B> 
  11.  </div> 
  12.  `, 
  13.  data(){ 
  14.  return { 
  15.  message:'Hello', 
  16.  messageC:'Hello c' 
  17.  } 
  18.  }, 
  19.  methods:{ 
  20.  getChildData(val){ 
  21.  console.log('这是来自B组件的数据') 
  22.  }, 
  23.  //执行C子组件触发的事件 
  24.  getCData(val){ 
  25.  console.log("这是来自C组件的数据:"+val) 
  26.  } 
  27.  } 
  28. }) 
  29. var app=new Vue({ 
  30.  el:'#app', 
  31.  template:` 
  32.  <div> 
  33.  <A></A> 
  34.  </div> 
  35.  ` 
  36. }) 

#p#副标题#e#

解析:

  • C组件中能直接触发getCData的原因在于 B组件调用C组件时 使用 v-on 绑定了$listeners 属性
  • 通过v-bind 绑定$attrs属性,C组件可以直接获取到A组件中传递下来的props(除了B组件中props声明的)

3. v-model

父组件通过v-model传递值给子组件时,会自动传递一个value的prop属性,在子组件中通过this.$emit(‘input’,val)自动修改v-model绑定的值

子组件

  1. Vue.component('child',{ 
  2.  props:{ 
  3.  //v-model会自动传递一个字段为value的prop属性 
  4.  value: String,  
  5.  }, 
  6.  data(){ 
  7.  return { 
  8.  myMessage:this.value 
  9.  } 
  10.  }, 
  11.  methods:{ 
  12.  changeValue(){ 
  13.  //通过如此调用可以改变父组件上v-model绑定的值 
  14.  this.$emit('input',this.myMessage); 
  15.  } 
  16.  }, 
  17.  template:` 
  18.  <div> 
  19.  <input  
  20.  type="text"  
  21.  v-model="myMessage"  
  22.  @change="changeValue"> 
  23.  </div> 
  24.  ` 
  25. }) 

#p#副标题#e##p#分页标题#e#

父组件

  1. Vue.component('parent',{ 
  2.  template:` 
  3.  <div> 
  4.  <p>this is parent compoent!</p> 
  5.  <p>{{message}}</p> 
  6.  <child v-model="message"></child> 
  7.  </div> 
  8.  `, 
  9.  data(){ 
  10.  return { 
  11.  message:'Hello' 
  12.  } 
  13.  } 
  14. }) 
  15. var app=new Vue({ 
  16.  el:'#app', 
  17.  template:` 
  18.  <div> 
  19.  <parent></parent> 
  20.  </div> 
  21.  ` 
  22. }) 

4. provide和inject

父组件中通过provider来提供变量,然后在子组件中通过inject来注入变量。不论子组件有多深,只要调用了inject那么就可以注入provider中的数据。而不是局限于只能从当前父组件的prop属性来获取数据,只要在父组件的生命周期内,子组件都可以调用。

子组件

  1. Vue.component('child',{ 
  2.  inject:['for'],//得到父组件传递过来的数据 
  3.  data(){ 
  4.  return { 
  5.  myMessage: this.for 
  6.  } 
  7.  }, 
  8.  template:` 
  9.  <div> 
  10.  <input type="tet" v-model="myMessage"> 
  11.  </div> 
  12.  ` 
  13. }) 

父组件

  1. Vue.component('parent',{ 
  2.  template:` 
  3.  <div> 
  4.  <p>this is parent compoent!</p> 
  5.  <child></child> 
  6.  </div> 
  7.  `, 
  8.  provide:{ 
  9.  for:'test' 
  10.  }, 
  11.  data(){ 
  12.  return { 
  13.  message:'Hello' 
  14.  } 
  15.  } 
  16. }) 
  17. var app=new Vue({ 
  18.  el:'#app', 
  19.  template:` 
  20.  <div> 
  21.  <parent></parent> 
  22.  </div> 
  23.  ` 
  24. }) 

5. 中央事件总线

上面方式都是处理的父子组件之间的数据传递,那如果两个组件不是父子关系呢?也就是兄弟组件如何通信?

#p#副标题#e#

这种情况下可以使用中央事件总线的方式。新建一个Vue事件bus对象,然后通过bus.$emit触发事件,bus.$on监听触发的事件。

  1. Vue.component('brother1',{ 
  2.  data(){ 
  3.  return { 
  4.  myMessage:'Hello brother1' 
  5.  } 
  6.  }, 
  7.  template:` 
  8.  <div> 
  9.  <p>this is brother1 compoent!</p> 
  10.  <input type="text" v-model="myMessage" @input="passData(myMessage)"> 
  11.  </div> 
  12.  `, 
  13.  methods:{ 
  14.  passData(val){ 
  15.  //触发全局事件globalEvent 
  16.  bus.$emit('globalEvent',val) 
  17.  } 
  18.  } 
  19. }) 
  20. Vue.component('brother2',{ 
  21.  template:` 
  22.  <div> 
  23.  <p>this is brother2 compoent!</p> 
  24.  <p>brother1传递过来的数据:{{brothermessage}}</p> 
  25.  </div> 
  26.  `, 
  27.  data(){ 
  28.  return { 
  29.  myMessage:'Hello brother2', 
  30.  brothermessage:'' 
  31.  } 
  32.  }, 
  33.  mounted(){ 
  34.  //绑定全局事件globalEvent 
  35.  bus.$on('globalEvent',(val)=>{ 
  36.  this.brothermessage=val; 
  37.  }) 
  38.  } 
  39. }) 
  40. //中央事件总线 
  41. var bus=new Vue(); 
  42. var app=new Vue({ 
  43.  el:'#app', 
  44.  template:` 
  45.  <div> 
  46.  <brother1></brother1> 
  47.  <brother2></brother2> 
  48.  </div> 
  49.  ` 
  50. }) 

6. parent和children

  1. Vue.component('child',{ 
  2.     props:{ 
  3.       value:String, //v-model会自动传递一个字段为value的prop属性 
  4.     }, 
  5.     data(){ 
  6.       return { 
  7.         mymessage:this.value 
  8.       } 
  9.     }, 
  10.     methods:{ 
  11.       changeValue(){ 
  12.         this.$parent.message = this.mymessage;//通过如此调用可以改变父组件的值 
  13.       } 
  14.     }, 
  15.     template:` 
  16.       <div> 
  17.         <input type="text" v-model="mymessage" @change="changeValue"> 
  18.       </div> 
  19.   }) 
  20.   Vue.component('parent',{ 
  21.     template:` 
  22.       <div> 
  23.         <p>this is parent compoent!</p> 
  24.         <button @click="changeChildValue">test</button > 
  25.         <child></child> 
  26.       </div> 
  27.     `, 
  28.     methods:{ 
  29.       changeChildValue(){ 
  30.         this.$children[0].mymessage = 'hello'; 
  31.       }//在此我向大家推荐一个前端全栈开发交流圈:619586920 突破技术瓶颈,提升思维能力 
  32.     }, 
  33.     data(){ 
  34.       return { 
  35.         message:'hello' 
  36.       } 
  37.     } 
  38.   }) 
  39.   var app=new Vue({ 
  40.     el:'#app', 
  41.     template:` 
  42.       <div> 
  43.         <parent></parent> 
  44.       </div> 
  45.     ` 
  46.   }) 

7. boradcast和dispatch

#p#副标题#e##p#分页标题#e#

vue1.0中提供了这种方式,但vue2.0中没有,但很多开源软件都自己封装了这种方式,比如min ui、element ui和iview等。 比如如下代码,一般都作为一个mixins去使用, broadcast是向特定的父组件,触发事件,dispatch是向特定的子组件触发事件,本质上这种方式还是on和on和emit的封装,但在一些基础组件中却很实用。

  1. function broadcast(componentName, eventName, params) { 
  2.  this.$children.forEach(child => { 
  3.  var name = child.$options.componentName; 
  4.  if (name === componentName) { 
  5.  child.$emit.apply(child, [eventName].concat(params)); 
  6.  } else { 
  7.  broadcast.apply(child, [componentName, eventName].concat(params)); 
  8.  } 
  9.  }); 
  10. export default { 
  11.  methods: { 
  12.  dispatch(componentName, eventName, params) { 
  13.  var parent = this.$parent; 
  14.  var name = parent.$options.componentName; 
  15.  while (parent && (!name || name !== componentName)) { 
  16.  parentparent = parent.$parent; 
  17.  if (parent) { 
  18.  name = parent.$options.componentName; 
  19.  } 
  20.  } 
  21.  if (parent) { 
  22.  parent.$emit.apply(parent, [eventName].concat(params)); 
  23.  } 
  24.  }, 
  25.  broadcast(componentName, eventName, params) { 
  26.  broadcast.call(this, componentName, eventName, params); 
  27.  } 
  28.  } 
  29. }; 

8. vuex处理组件之间的数据交互

如果业务逻辑复杂,很多组件之间需要同时处理一些公共的数据,这个时候才有上面这一些方法可能不利于项目的维护,vuex的做法就是将这一些公共的数据抽离出来,然后其他组件就可以对这个公共数据进行读写操作,这样达到了解耦的目的。

【编辑推荐】

  1. Vue服务端渲染实践 ——Web应用首屏耗时最优化方案
  2. JS框架对比,Angular还是Vue适宜才最好
  3. Vue使用技巧和项目中遇到的问题
  4. Vue.js的注意事项与技巧
  5. Vue UI:Vue 开发者必不可少的工具

【责任编辑:赵宁宁 TEL:(010)68476606】
点赞 0

dawei

【声明】:北京站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

您错过了

模块化思维实战:后端站长从0到1构建高效网站,reasoning_content:我们要求以后端站长的口吻,写一个与“技术、科技”相关,关于[从0到1:运用模块化思维与实战技巧,轻松构建高效网站]的标题需要简短精炼,30字以内直接输出标题,不要加说明nn可以考虑:后端站长视角,强调模块化思维和实战技巧,从0到1构建高效网站可能的从0到1:后端站长教你模块化构建高效网站 但字数可能超?数一下:从0到1:后端站长教你模块化构建高效网站 —— 共18个字符(包括标点)?汉字每个算一个字,冒号、空格?严格来说:从0到1:后端站长教你模块化构建高效网站 共16个字(从0到1:后端站长教你模块化构建高效网站,数一下:从0到1:(3个汉字+1个冒号?不,是从0到1是4个字符,但通常算4个?我们按汉字+符号更好的:去掉一些词nn模块化思维实战:后端站长从0到1建高效站 数一下:模块化思维实战:后端站长从0到1建高效站 —— 共18个?模块化思维实战(6字)冒号(1)后端站长(4)从0到1(4)建高效站(4)总19?有点多nn更简洁:模块化构建高效网站:后端站长的从0到1 共14个字?模块化构建高效网站:后端站长的从0到1 —— 13个汉字+1冒号+1数字?其实从0到1是4个字符可以nn或者:后端站长:模块化思维从0到1打造高效网站 共16字?后端站长:模块化思维从0到1打造高效网站 —— 数:后(1)端(2)站(3)长(4):(5)模(6)块(7)化(8)思(9)维(10)从(11)0(12)到(13)1(14)打(15)造(16)高(17)效(18)网(19)站(20) —— 20字,超了nn要控制在30字以内,所以20字以内都行但最好更精炼nn考虑直接用原话中的从0到1和模块化思维、实战技巧、高效网站但题目要求以后端站长口吻,所以可以加上后端站长nn思路:从0到1:后端站长的模块化实战,高效网站轻松建 数一下:从0到1:后端站长的模块化实战,高效网站轻松建 —— 从0到1(4)冒号(1)后端站长(4)的(1)模块化实战(5)逗号(1)高效网站(4)轻松建(3)总共4+1+4+1+5+1+4+3=23字可以nn更简洁:模块化思维实战:后端站长从0到1建高效站 前面数过19字nn或者:后端站长带你从0到1模块化构建高效网站 15字nn注意:要求与技术、科技相关,但标题本身已经涉及nn我会选择:后端站长:模块化思维从0到1轻松构建高效网站 数:后(1)端(2)站(3)长(4):(5)模(6)块(7)化(8)思(9)维(10)从(11)0(12)到(13)1(14)轻(15)松(16)构(17)建(18)高(19)效(20)网(21)站(22) —— 22字可以nn另一个:从0到1:后端站长模块化实战构建高效网站 22字左右nn为了更口语化:从0到1轻松建站:后端站长教你模块化实战 15字?从0到1轻松建站:后端站长教你模块化实战 —— 共18字?nn我最后决定用:从0到1:模块化+实战,后端站长教你轻松建高效站 数:从0到1:模块化+实战,后端站长教你轻松建高效站 —— 共?从(1)0(2)到(3)1(4):(5)模(6)块(7)化(8)+(9)实(10)战(11),(12)后(13)端(14)站(15)长(16)教(17)你(18)轻(19)松(20)建(21)高(22)效(23)站(24) —— 24字略长去掉教你变成从0到1:模块化+实战,后端站长轻松建高效站 22字nn或者直接:模块化思维实战:后端站长从0到1构建高效网站 18字?数一下:模(1)块(2)化(3)思(4)维(5)实(6)战(7):(8)后(9)端(10)站(11)长(12)从(13)0(14)到(15)1(16)构(17)建(18)高(19)效(20)网(21)站(22) —— 22字还是22nn我认为22字完全在30字以内可以输出这个nn注意:不要加任何说明直接输出标题