资讯专栏INFORMATION COLUMN

vue项目笔记-封装组件篇

widuu / 3095人阅读

摘要:在父组件使用方法父组件模拟异步数据异步的数据子组件使用来监听父组件改变的,使用来代替既然只会执行一次,但是又想监听改变的值做其他事情的话,可使用这个方法。

我一直都相信,决定未来的是自信与成长速度,成长的过程中,整理是一个非常重要的环节,接下来是我整理的系统组件开发常用的部分。

本文的主要内容有:

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";
  
    
123
以上适用于单个内容,如果内容是v-for循环,且高度不固定,使用的是vue 的transition-group **vue组件:**
    
         
{{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


子组件的html中的{{childData}}的值会随着父组件的值而改变,但是created里面的却不会发生改变(生命周期问题)
解决办法:我这里给出我经常用的两种常用的解决方案,还有其他的解决方案 https://www.jb51.net/article/...。
1.在父组件使用v-if 方法



2.子组件使用watch来监听父组件改变的prop,使用methods来代替created,既然created只会执行一次,但是又想监听改变的值做其他事情的话,可使用这个方法。





以上是整理的内容。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/95855.html

相关文章

  • vue插件开发流程详解-从开发到发布至npm(二)

    摘要:使用插件安装使用测试访问页面注意大大的红字,如果要在本项目下测试,需要修改项目名称,不然报项目名字和包名字是一致的错,无法安装的如下结束语这个笔记继上一篇插件开发流程详解从开发到发布至一,替换了开发和测试的项目架构。   前记:上一篇 https://www.cnblogs.com/adouw...,说到了一个完整的vue插件开发、发布的流程,总结下来就讲了这么一个事,如何注入vue,...

    Flink_China 评论0 收藏0
  • 关于Vue2一些值得推荐的文章 -- 五、六月份

    摘要:五六月份推荐集合查看最新的请点击集前端最近很火的框架资源定时更新,欢迎一下。苏幕遮燎沈香宋周邦彦燎沈香,消溽暑。鸟雀呼晴,侵晓窥檐语。叶上初阳乾宿雨,水面清圆,一一风荷举。家住吴门,久作长安旅。五月渔郎相忆否。小楫轻舟,梦入芙蓉浦。 五、六月份推荐集合 查看github最新的Vue weekly;请::点击::集web前端最近很火的vue2框架资源;定时更新,欢迎 Star 一下。 苏...

    sutaking 评论0 收藏0
  • 关于Vue2一些值得推荐的文章 -- 五、六月份

    摘要:五六月份推荐集合查看最新的请点击集前端最近很火的框架资源定时更新,欢迎一下。苏幕遮燎沈香宋周邦彦燎沈香,消溽暑。鸟雀呼晴,侵晓窥檐语。叶上初阳乾宿雨,水面清圆,一一风荷举。家住吴门,久作长安旅。五月渔郎相忆否。小楫轻舟,梦入芙蓉浦。 五、六月份推荐集合 查看github最新的Vue weekly;请::点击::集web前端最近很火的vue2框架资源;定时更新,欢迎 Star 一下。 苏...

    khs1994 评论0 收藏0
  • 使用 Vuex + Vue.js 构建单页应用

    摘要:鉴于该篇文章阅读量大,回复的同学也挺多的,特地抽空写了一篇下的使用方法,传送门使用构建单页应用新篇华丽的分割线原文地址前言在最近学习的时候,看到国外一篇讲述了如何使用和来构建一个简单笔记的单页应用的文章。 鉴于该篇文章阅读量大,回复的同学也挺多的,特地抽空写了一篇 vue2.0 下的 vuex 使用方法,传送门:使用 Vuex + Vue.js 构建单页应用【新篇】 ---------...

    tomorrowwu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<