<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近兩年都是在使用 react 進行專案開發,看技術部落格都是針對 react 和 javaScript 高階方面的,對 vue 的知識基本上遺忘的差不多了。最近開始慢慢回顧 vue 的知識以及對新的語法進行學習,為後面的計劃做準備(哈哈哈,懂得都懂)。
先從最簡單的樣式開始吧。
vue 的樣式繫結要人性化很多,react 實現 vue 的這種寫法,還需要專門下載一個第三方庫: classnames。
vue 的樣式繫結有兩種形式:物件和陣列。
相對而言,個人還是比較的偏向物件的寫法,可能 react 寫習慣了吧。原因有兩點:
[]
形式,感覺看起來比較的怪異,複雜。我把物件的形式分為三種場景,分別如下:
場景一:迴圈列表,根據列表項的某屬性的不同而展示不同
<script setup lang="ts"> const list = [ { id: "1", name: "name1", isActive: true, }, { id: "2", name: "name2", isActive: false, }, { id: "3", name: "name3", isActive: false, }, ]; </script> <template> <div v-for="item in list" :key="item.id" class="common" :class="{ isActive: item.isActive }" > {{ item.name }} </div> </template> <style> .isActive { color: red; } </style>
根據列表項的isActive的屬性值不同,來判斷是否顯示isActive類名。
場景二:通過觸發事件,來展示不同的樣式。
這種情況一般針對於使用者操作,比如點選按鈕觸發事件,來修改某一內容的樣式。
<script setup lang="ts"> import { ref } from "vue"; const isActive = ref<boolean>(false); // 事件改變 data 屬性值 const btn = () => { isActive.value = !isActive.value; }; </script> <template> <div class="common" :class="{ isActive: isActive }">文字說明</div> <button @click="btn">改變樣式</button> </template> <style> .common { font-size: 20px; } .isActive { color: red; }
通過點選事件,修改 data 中的值,從而影響到 div 標籤的類名展示。
情況三:當關聯多個動態樣式,直接繫結一個物件
上面的情況,當存在少量的動態樣式(1~2個)的時候,可以直接寫在DOM結構中,閱讀性可觀。當存在多個的時候,還這樣寫的話,可能 DOM 就顯的混亂了,閱讀性極低,這時藉助一個物件就很好的解決了這個問題。
<script setup lang="ts"> import { reactive } from "vue"; const classObj = reactive({ isActive: true, hasError: false, textRed: true, }); </script> <template> <div class="common" :class="classObj">文字說明</div> </template>
陣列的寫法,對於個人來說,就大致的瞭解下就行了。
形式一:繫結多個class
<script setup lang="ts"> import { ref } from "vue"; const activeClass = ref("active"); const errorClass = ref("text-danger"); </script> <template> <div :class="[activeClass, errorClass]"></div> </template>
最後渲染出來的結果:
<div class="active text-danger"></div>
形式二:陣列中的判斷
<!--三目運運算元的判斷--> <div :class="[isActive ? activeClass : '', errorClass]"></div> <!--陣列中巢狀物件的判斷--> <div :class="[{activeClass: isActive}, errorClass]"></div>
vue 中的動態 style 跟 class 的用法基本相似的,就不用多說了。
在上面的樣式繫結中,都是把 class 寫在了原生標籤上,那麼如果把 class 寫在元件上,效果是什麼呢?
在此之前,先來彌補兩個小知識點。
知識點一:vue3 支援多個根節點
<!--vue2: 錯誤的寫法--> <template> <div></div> <div></div> </template> <!--vue3: 正確--> <template> <div></div> <div></div> </template>
知識點二:什麼是透傳的attributes?
“透傳 attribute”指的是傳遞給一個元件,卻沒有被該元件宣告為 props 或 emits 的 attribute 或者 v-on 事件監聽器。常見的有 class
style
id
.
簡單的理解就是:傳遞給子元件的屬性,但是被沒有在子元件宣告,就是透傳 attributes。
準備工作完成,可以開始正題了。
分為兩種情況,只有一個根節點或者多個根節點。
情況一:子元件只有一個根節點
<!--son子元件--> <template> <div class="own">son元件</div> </template>
存在自身的類名 own
<!--父元件使用Son--> <Son class='abc' />
class 並沒有在 props 中申明,那麼它就是透傳 attributes。
那麼最後渲染的結果:
<div class='abc own'>son元件</div>
就會主動的繫結到根節點上去,與原來的 class 進行組合。
情況二:子元件有多個根節點
存在多個根節點的時候,並且還傳遞了透傳 attributes,如果沒有手動處理的話,是會存在警告的。
<!--son子元件--> <template> <div class="own">son元件1</div> <div class="own">son元件2</div> </template>
<!--父元件使用Son--> <Son class='abc' />
沒有處理,丟擲警告:
那麼處理警告的方式兩種:
inheritAttrs
為 false(後面再說)。<!--son子元件--> <template> <div class="own" :class="$attrs['class']">son元件1</div> <div class="own">son元件2</div> </template>
這樣警告也會消失,並且把透傳 attributes 繫結在了第一個根節點上。這裡的$attrs
是一個物件,需要具體指明某個屬性。
最後渲染的結果:
<div class="own abc">son元件1</div> <div class="own">son元件2</div>
上面只是針對樣式進行了透傳,那麼事件的話,又會是怎麼樣的呢?
先說結論吧,表現形式跟樣式繫結是基本一樣的。
<!--子元件Son--> <script setup lang="ts"> const btn1 = () => { console.log("子元件的點選事件"); }; </script> <template> <button @click="btn1">點選</button> </template>
現在子元件的根節點是一個 button 標籤,並且上面繫結了一個點選事件。
<!--父元件使用--> <script setup lang="ts"> import Son from "./Son.vue"; const btn = () => { console.log("父元件的點選事件"); }; </script> <template> <Son @click="btn" /> </template>
父元件呼叫,也傳遞了一個透傳的事件過來。當點選按鈕:
發現,子元件的事件被觸發了,父元件傳遞過來的事件也被觸發了,順序為先子後父。
透傳的 attributes 基本說完了,接下來就看看幾個特殊部分吧。
有些情況下一個元件會在根節點上渲染另一個元件。那麼透傳 attributes 也會繼續傳遞下去。
<!--baseChild--> <template> <div></div> </template> <!--child--> <template> <base-child /> </template> <!--father--> <Child class='abc'/>
那麼最後渲染的結果:
<div class='abc'></div>
設定 inheritAttrs:false
,就禁止使用了自動繫結,可以消除前面所說的警告;然後就可以自由的繫結 $attrs
, 該物件就包含了傳遞過來的透傳 attributes。
<!--如果是setup寫法,就需要單獨新增一個script標籤,暴露一個設定物件--> <script lang="ts"> export default { inheritAttrs: false, // 禁用 }; </script> <script setup lang="ts"> const btn1 = () => { console.log("子元件的點選事件"); }; </script> <template> <button @click="btn1">點選</button> </template>
需要注意的是:
$attrs['foo-bar']
來存取。$attrs.onClick
。在元件範例中獲取,通過 this 的形式
export default { created() { console.log(this.$attrs) } }
回顧了vue中動態繫結樣式,還是比較簡單;又新學習了一點 vue3 的新知識:透傳attributes,收穫滿滿。
參考檔案
以上就是vue3中的透傳attributes教學範例詳解的詳細內容,更多關於vue3透傳attributes的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45