摘要:在父組件使用方法父組件模擬異步數據異步的數據子組件使用來監聽父組件改變的,使用來代替既然只會執行一次,但是又想監聽改變的值做其他事情的話,可使用這個方法。
我一直都相信,決定未來的是自信與成長速度,成長的過程中,整理是一個非常重要的環節,接下來是我整理的系統組件開發常用的部分。
本文的主要內容有:
1.table內編輯 2.高度不固定,顯示隱藏過渡動畫 3.解決vue父組件傳遞props異步數據到子組件的問題一、vue table內編輯
需求:
1.table點擊編輯按鈕時,顯示input(此input可修改table里某一行某一列的內容)、取消按鈕、保存按鈕。
2.點擊保存按鈕,則保存編輯后的內容,點擊取消則不保存。
思路:
1.點擊編輯時編輯按鈕隱藏,保存和取消顯示。可使用$set,在每一行數據里增加一個屬性edit,this.$set(v, "edit", false);,組件標簽里用v-show=“scope.row.edit 進行顯示隱藏。$set官方解釋(向響應式對象中添加一個屬性,并確保這個新屬性同樣是響應式的,且觸發視圖更新。它必須用于向響應式對象上添加新屬性)。
2.編輯由于input是雙向綁定,輸入的時候就改變了數據,點擊取消時,需恢復原來的數據。需 “拷貝” 一份原來的數據,如取消則使用這個數據。代碼有兩部分,一部分是只針對一列,名字寫實,理解思路。另一部分是實際項目開發能用到的,每一列都可編輯,并且名字可變。代碼如下:
(1)理解思路,title列進行可編輯
請求table數據 this.$http.get(this.tableUrl).then(response => { let commTable1 =response.data.tableData; this.list = commTable1 .map(v => { this.$set(v, "edit", false); v.oldTitle = v.title ; return v }) }) 點擊保存 save(row) { row.edit = false row.oldTitle = row.title } 點擊取消 cancel(row) { row.title = row.oldTitle row.edit = false }
(2)table每一列進行編輯
table請求數據 this.$http.get(this.tableUrl).then(response => { response = response.data; let commTable1 =response.tableData; this.commTable= commTable1.map(v => { for(var obj in v){ v[`old${obj}`]=v[obj] } this.$set(v, "edit", false); return v }) }); 點擊保存 save(row) { for(var obj in row){ let str = ""; if(obj.indexOf("old")>-1){ str = obj.replace("old",""); row[obj]=row[str]; } } row.edit = false } } 點擊取消 cancel(row) { let str = ""; if(obj.indexOf("old")>-1){ str = obj.replace("old",""); row[str]=row[obj]; } } row.edit = false; }二、高度不固定,上下滑動動畫
不管是vue的過渡動畫,還是element的過渡動畫,都是需要高度固定,無法滿足需求。接下來是一個大神封裝的一個函數式組件,這個組件只適用于單個內容,如果內容是v-for循環,且高度不固定,我做了一下改裝,使用的是vue 的transition-group。Vue.JS實現垂直方向展開、收縮不定高度模塊的JS組件
const elTransition = "0.3s height ease-in-out, 0.3s padding-top ease-in-out, 0.3s padding-bottom ease-in-out" const Transition = { "before-enter" (el) { el.style.transition = elTransition if (!el.dataset) el.dataset = {} el.dataset.oldPaddingTop = el.style.paddingTop el.dataset.oldPaddingBottom = el.style.paddingBottom el.style.height = 0 el.style.paddingTop = 0 el.style.paddingBottom = 0 }, "enter" (el) { el.dataset.oldOverflow = el.style.overflow if (el.scrollHeight !== 0) { el.style.height = el.scrollHeight + "px" el.style.paddingTop = el.dataset.oldPaddingTop el.style.paddingBottom = el.dataset.oldPaddingBottom } else { el.style.height = "" el.style.paddingTop = el.dataset.oldPaddingTop el.style.paddingBottom = el.dataset.oldPaddingBottom } el.style.overflow = "hidden" }, "after-enter" (el) { el.style.transition = "" el.style.height = "" el.style.overflow = el.dataset.oldOverflow }, "before-leave" (el) { if (!el.dataset) el.dataset = {} el.dataset.oldPaddingTop = el.style.paddingTop el.dataset.oldPaddingBottom = el.style.paddingBottom el.dataset.oldOverflow = el.style.overflow el.style.height = el.scrollHeight + "px" el.style.overflow = "hidden" }, "leave" (el) { if (el.scrollHeight !== 0) { el.style.transition = elTransition el.style.height = 0 el.style.paddingTop = 0 el.style.paddingBottom = 0 } }, "after-leave" (el) { el.style.transition = "" el.style.height = "" el.style.overflow = el.dataset.oldOverflow el.style.paddingTop = el.dataset.oldPaddingTop el.style.paddingBottom = el.dataset.oldPaddingBottom } } export default { name: "VerticalToggle", functional: true, render (h, { children }) { const data = { on: Transition } return h("transition", data, children) } }
組件中可這樣使用
import verticalToggle from "./vertical-toggle.js";以上適用于單個內容,如果內容是v-for循環,且高度不固定,使用的是vue 的transition-group **vue組件:** 123
{{item2.name}}
方法:
enter(el){ el.style.height = el.scrollHeight + "px"; el.style.paddingTop = el.dataset.oldPaddingTop el.style.paddingBottom = el.dataset.oldPaddingBottom }, beforeLeave(el){ el.dataset.oldPaddingTop = el.style.paddingTop el.dataset.oldPaddingBottom = el.style.paddingBottom el.dataset.oldOverflow = el.style.overflow el.style.height = el.scrollHeight + "px" el.style.overflow = "hidden" }, leave(el){ el.style.height = 0 el.style.paddingTop = 0 el.style.paddingBottom = 0 },
}
css:
.fade2-enter-active,.fade2-leave-active { transition: all .5s; } .fade-enter,.fade2-enter,.fade-leave-to,.fade2-leave-to{ height: 0px; }
如果有需求是還要在顯示的組件里添加內容,則還需下面代碼,因為this.$refs不支持響應,所以就在updated生命周期里寫了。
updated() { if(this.flog1){ for(let obj of this.list){ let index=this.list.indexOf(obj) this.$refs.fade[index].style.height="auto"; } this.flog2=false; } },三、解決vue父組件傳遞props異步數據到子組件的問題
data為異步獲取的數據,想傳遞給子組件使用
父組件子組件child.vue 子組件{{childData}}
子組件的html中的{{childData}}的值會隨著父組件的值而改變,但是created里面的卻不會發生改變(生命周期問題)
解決辦法:我這里給出我經常用的兩種常用的解決方案,還有其他的解決方案 https://www.jb51.net/article/...。
1.在父組件使用v-if 方法
父組件
2.子組件使用watch來監聽父組件改變的prop,使用methods來代替created,既然created只會執行一次,但是又想監聽改變的值做其他事情的話,可使用這個方法。
子組件{{childData}}
以上是整理的內容。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/95855.html
摘要:使用插件安裝使用測試訪問頁面注意大大的紅字,如果要在本項目下測試,需要修改項目名稱,不然報項目名字和包名字是一致的錯,無法安裝的如下結束語這個筆記繼上一篇插件開發流程詳解從開發到發布至一,替換了開發和測試的項目架構。 前記:上一篇 https://www.cnblogs.com/adouw...,說到了一個完整的vue插件開發、發布的流程,總結下來就講了這么一個事,如何注入vue,...
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
摘要:鑒于該篇文章閱讀量大,回復的同學也挺多的,特地抽空寫了一篇下的使用方法,傳送門使用構建單頁應用新篇華麗的分割線原文地址前言在最近學習的時候,看到國外一篇講述了如何使用和來構建一個簡單筆記的單頁應用的文章。 鑒于該篇文章閱讀量大,回復的同學也挺多的,特地抽空寫了一篇 vue2.0 下的 vuex 使用方法,傳送門:使用 Vuex + Vue.js 構建單頁應用【新篇】 ---------...
閱讀 3626·2021-11-24 09:39
閱讀 2563·2021-11-15 11:37
閱讀 2220·2021-11-11 16:55
閱讀 5221·2021-10-14 09:43
閱讀 3714·2021-10-08 10:05
閱讀 3016·2021-09-13 10:26
閱讀 2334·2021-09-08 09:35
閱讀 3546·2019-08-30 15:55