整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          父組件如何在子組件上綁定事件,.native的用法

          父組件如何在子組件上綁定事件,.native的用法

          、先從一個簡單的例子開始吧,創建一個空白文件test.html,添加vue庫鏈接。

          二、這里創建一個全局子組件和一個父組件,父組件綁定vmdiv。

          • 打開瀏覽器,子組件顯示正常。

          三、在vmdiv下創建一個div,并添加一個點擊事件。

          • 測試點擊正常。

          四、于是我們用同樣的方法,也給子組件添加一個點擊事件,發現居然點擊沒有效果。

          五、所以子組件的事件不同于原生元素里添加事件,在子組件里要添加一個.native。

          、深度作用選擇器( >>> )

          嚴格來說,這個應該是vue-loader的功能?!眝ue-loader”: “^12.2.0”

          在項目開發中,如果業務比較復雜,特別像中臺或B端功能頁面都不可避免的會用到第三方組件庫,產品有時會想對這些組件進行一些UI方面的定制。如果這些組件采用的是有作用域的CSS,父組件想要定制第三方組件的樣式就比較麻煩了。

          深度作用選擇器( >>> 操作符)可以助你一臂之力。

          上面的child組件中 .child-title 的作用域CSS設定字體大小為12px,現在想在父組件中定制為大小20px,顏色為紅色。

          效果妥妥的。但是別高興太早,注意到上面的style使用的是純css語法,如果采用less語法,你可能會收到一條webpack的報錯信息。

          <style lang="less">

          .parent-custom {

          >>> .child-title {

          font-size:20px;

          color: red;

          }

          }

          </style>

          ERROR in ./~/css-loader!./~/vue-loader/lib/style-compiler?{"vue":true,"id":"data-v-960c5412","scoped":false,"hasInlineConfig":false}!./~/postcss-loader!./~/less-loader!./~/vue-loader/lib/selector.js?type=styles&index=0!./src/components/parent.vue

          Module build failed: Unrecognised input

          @ /src/components/parent.vue (line 22, column 6)

          near lines:

          .parent-custom {

          >>> .child-title {

          font-size:20px;

          上面的報錯信息其實是less語法不認識 >>>。(less的github issue上有人提議支持>>>操作符,但本文使用的v2.7.3會有這個問題)

          解決方案是采用的less的轉義(scaping)和變量插值(Variable Interpolation)

          對于其他的css預處理器,因為沒怎么用,不妄加評論,照搬一下文檔的話。

          有些像 Sass 之類的預處理器無法正確解析 >>>。這種情況下你可以使用 /deep/ 操作符取而代之——這是一個 >>> 的別名,同樣可以正常工作。

          二、組件配置項inheritAttrs、組件實例屬性$attrs和$listeners

          2.4.0新增

          組件配置項 inheritAttrs

          我們都知道假如使用子組件時傳了a,b,c三個prop,而子組件的props選項只聲明了a和b,那么渲染后c將作為html自定義屬性顯示在子組件的根元素上。

          如果不希望這樣,可以設置子組件的配置項 inheritAttrs:false,根元素就會干凈多了。

          組件實例屬性$attrs和$listeners

          先看看vm.$attrs文檔上是怎么說的

          vm.$attrs

          歸納起來就是兩點:

          vm.$attrs是組件的內置屬性,值是父組件傳入的所有prop中未被組件聲明的prop(class和style除外)。

          還是以前面的child組件舉例

          組件可以通過在自己的子組件上使用v-bind=”$attrs”,進一步把值傳給自己的子組件。也就是說子組件會把$attrs的值當作傳入的prop處理,同時還要遵守第一點的規則。

          vm.$listeners

          歸納起來也是兩點:

          1、vm.$listeners是組件的內置屬性,它的值是父組件(不含 .native 修飾器的) v-on 事件監聽器。

          2、組件可以通過在自己的子組件上使用v-on=”$listeners”,進一步把值傳給自己的子組件。如果子組件已經綁定$listener中同名的監聽器,則兩個監聽器函數會以冒泡的方式先后執行。

          //parent.vue

          <template>

          <div>

          <child @update="onParentUpdate"></child>

          </div>

          </template>

          <script>

          export default {

          name: 'parent',

          components:{

          Child

          },

          methods:{

          onParentUpdate(){

          console.log('parent.vue:onParentUpdate')

          }

          }

          }

          </script>

          //child.vue

          <template>

          <div>

          <grand-child @update="onChildUpdate" v-on="$listeners"></grand-child>

          </div>

          </template>

          <script>

          export default {

          name: 'child',

          components:{

          GrandChild

          },

          methods:{

          onChildUpdate(){

          console.log('child.vue:onChildUpdate')

          }

          }

          }

          </script>

          //grandchild.vue

          <script>

          export default {

          name: 'grandchild',

          mounted(){

          //控制臺輸出:

          //grandchild:$listeners: {update: ?}

          console.log('grandchild:$listeners:',this.$listeners);

          //控制臺輸出:

          //child.vue:onChildUpdate

          //parent.vue:onParentUpdate

          this.$listeners.update();

          }

          }

          </script>

          三、組件選項 provide/inject

          在2.5.0+時對于inject選項為對象時,還可以指定from來表示源屬性,default指定默認值(如果是非原始值要使用一個工廠方法)。

          四、作用域插槽 slot-scope

          可以看出列表頁和編輯頁對于數據的展示是一樣的,唯一的區別是在不同頁面對于數據有不同的處理邏輯。相同的數據展示這塊就可抽取成一個組件,不同的地方則可以借助作用域插槽實現。

          五、Vue的錯誤捕獲

          全局配置errorHandler

          生命周期鉤子errorCaptured

          如果熟悉React的話,會發現它跟錯誤邊界(Error Boundaries)的概念很像,實際上也確實是這么用的。

          在文檔Error Handling with errorCaptured Hook就舉了一個典型的例子

          需要強調的是errorCaptured并不能捕獲自身錯誤和異步錯誤(比如網絡請求,鼠標事件等產生的錯誤)。

          參考

          • 文只有一個學習點。
          • 父組件如何向子組件傳遞數據。
          • 一起學習,更多文章請關注我的頭條號,我是落筆承冰。

          一、先創建一張空白網頁index.html,在head標簽里設置好vue的鏈接庫。

          二、寫一個綁定元素div,一個子組件,一個父組件,父組件與元素div綁定。

          三、我們寫子組件的模板,并在div內調用它,看看是否有效果。

          • 你會發現網頁里,空空的,什么也沒有,那是因為是子組件沒有在父組件里注冊。
          • 不是全局子組件,是要在父組件那里注冊的。

          四、那我們注冊子組件吧。

          • 再刷新瀏覽器,終于出來了。

          五、我們先試一下,父組件怎么把數據傳給子組件。:tocmp就是父組件的要傳給子組件的數據,子組件用props來接收。

          • 試試效果吧

          • 這里就完成了父組件向子組件傳遞數據。

          主站蜘蛛池模板: 亚洲性日韩精品国产一区二区| 91精品一区国产高清在线| 国产精品亚洲一区二区三区久久| 久久国产精品无码一区二区三区 | 2014AV天堂无码一区| 日韩在线视频不卡一区二区三区| 香蕉在线精品一区二区| 无码国产精品一区二区免费3p| 亚洲色无码一区二区三区| 国产精品一区二区三区久久| 无码日韩精品一区二区人妻| 国产亚洲一区区二区在线| 亚洲日韩精品一区二区三区| 色狠狠AV一区二区三区| 夜夜精品视频一区二区| 亚洲美女高清一区二区三区| 红桃AV一区二区三区在线无码AV| 夜夜嗨AV一区二区三区| 成人h动漫精品一区二区无码| 一区二区视频免费观看| 国产乱码一区二区三区| 中文字幕一区二区区免| 亚洲中文字幕丝袜制服一区 | 国产一区三区二区中文在线 | 日本一区午夜爱爱| 国产日韩一区二区三区在线播放| 久久一区不卡中文字幕| 亚洲一区无码中文字幕| 美女一区二区三区| 国产激情视频一区二区三区| 精品国产免费一区二区三区| 91精品福利一区二区三区野战| 国产av夜夜欢一区二区三区| 国产成人一区二区三中文| 丰满岳乱妇一区二区三区| 国内精品视频一区二区三区 | 不卡一区二区在线| 中文字幕精品一区二区日本| 国偷自产Av一区二区三区吞精 | 最新中文字幕一区二区乱码| 国产一区二区三区内射高清|