vue实现可视化可拖放的自定义表单的示例代码


Posted in Javascript onMarch 20, 2019

实现如例子所示的可视化可拖放表单功能。整个页面,分为左中右三栏布局,左栏的部件库的部件(组件)作为key,拖放到中间区域时,往vuex存放数组数据,拖一个就push一个。点击某个组件时,在右栏显示其属性,其实也就是在vuex存放的数据中查找数据迭代属性。

左中右三栏 左右固定 中间自适应布局

首先,布局上来看,左右都是可以拉伸的,中间是自适应的布局。

左右分别float left和float right, 中间栏使用margin撑开布局,即可完成布局

动态缩放浏览器窗口来查看效果

动态显示template

第二个重要点就是让template可编程,

例如: 传来一个字符串<el-button>按钮</el-button>,如何显示成为组件而不是字符串标签呢。

关键点: 使用js和vue extends

新建js

export default Vue.component('CustomTemplate', {
  props: {
    html: String
  },
  render (h) {
   return h(Vue.extend({ // 关键点
     template: `<div class="root-custom-template">${this.html}</div>`,
     data () {
      return {
       current: ''
      }
     },
     methods: {
      doclick (uuid, id) {
       this.current = uuid
       this.$store.commit('EditPanel/changeId', uuid)
      },
      dodragstart (ev) {
       ev.dropEffect = 'move'
      }
     }
  }))
 },
})

拖放操作和数据的组装

在文章开头已经分析好了,整个数据的流向,接下来就是用vuex去实现。

拖放组件使用vuedraggable,拖放完成的时候,鉴于MVVM的特点,画面改变<=>数据改变,操作vuex时注意不能直接修改state

computed: {
  myList: {
    get() {
      return this.$store.state.myList
    },
    set(value) {
      this.$store.commit('updateList', value)
    }
  }
}

整个数据流向: 左栏组件库<-->中间展示栏 <---->右栏属性设置, 控制不好数据的话,可能会出现原始数据被修改的情况。请看:

var a = { k: 1 }
var b = a
b.k = 2
console.log(a) // { k: 2 }

这就会无意间导致数据被修改,很难排查。可以使用Object.freeze冻结对象,避免出错。

Object.freeze

function deepFreeze(obj) {

 // 取回定义在obj上的属性名
 var propNames = Object.getOwnPropertyNames(obj);

 // 在冻结自身之前冻结属性
 propNames.forEach(function(name) {
  var prop = obj[name];

  // 如果prop是个对象,冻结它
  if (typeof prop == 'object' && prop !== null)
   deepFreeze(prop);
 });

 // 冻结自身(no-op if already frozen)
 return Object.freeze(obj);
}

demo项目github

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
页面中iframe相互传值传参
Dec 13 Javascript
JQuery 插件模板 制作jquery插件的朋友可以参考下
Mar 17 Javascript
jquery序列化表单以及回调函数的使用示例
Jul 02 Javascript
自己动手写的jquery分页控件(非常简单实用)
Oct 28 Javascript
javascript适合移动端的日期时间拾取器
Nov 10 Javascript
Javascript实现代码折叠功能
Aug 25 Javascript
JS实现中国公民身份证号码有效性验证
Feb 20 Javascript
jQuery 开发之EasyUI 添加数据的实例
Sep 26 jQuery
video.js 实现视频只能后退不能快进的思路详解
Aug 09 Javascript
通过js给网页加上水印背景实例
Jun 17 Javascript
Vue配置marked链接添加target=&quot;_blank&quot;的方法
Jul 19 Javascript
JavaScript实现背景自动切换小案例
Sep 27 Javascript
详解JavaScript作用域和作用域链
Mar 19 #Javascript
vue双向绑定及观察者模式详解
Mar 19 #Javascript
Vue2.0+Vux搭建一个完整的移动webApp项目的示例
Mar 19 #Javascript
在vue中使用G2图表的示例代码
Mar 19 #Javascript
Three.js中矩阵和向量的使用教程
Mar 19 #Javascript
vue+iview动态渲染表格详解
Mar 19 #Javascript
浅谈vue加载优化策略
Mar 19 #Javascript
You might like
php 什么是PEAR?(第三篇)
2009/03/19 PHP
php检查字符串中是否包含7位GSM字符的方法
2015/03/17 PHP
PHP获取某个月最大天数(最后一天)的方法
2015/07/29 PHP
ThinkPHP打水印及设置水印位置的方法
2016/10/14 PHP
php 静态属性和静态方法区别详解
2017/04/09 PHP
node.js中使用socket.io的方法
2014/12/15 Javascript
js实现缓冲运动效果的方法
2015/04/10 Javascript
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
利用Node.JS实现邮件发送功能
2016/10/21 Javascript
jQuery.ajax向后台传递数组问题的解决方法
2017/05/12 jQuery
微信小程序页面滑动屏幕加载数据效果
2020/11/16 Javascript
详解使用Vue Router导航钩子与Vuex来实现后退状态保存
2017/09/11 Javascript
js+canvas绘制图形验证码
2020/09/21 Javascript
Javascript实现单选框效果
2020/12/09 Javascript
python查找第k小元素代码分享
2013/12/18 Python
python中类的一些方法分析
2014/09/25 Python
Python使用urllib2模块实现断点续传下载的方法
2015/06/17 Python
利用Python为iOS10生成图标和截屏
2016/09/24 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
在pytorch中为Module和Tensor指定GPU的例子
2019/08/19 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
keras 如何保存最佳的训练模型
2020/05/25 Python
Python Django搭建网站流程图解
2020/06/13 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
2020/06/14 Python
python的pip有什么用
2020/06/17 Python
jupyter notebook快速入门及使用详解
2020/11/13 Python
印尼美容产品购物网站:PerfectBeauty.id
2017/12/01 全球购物
京东港澳售:京东直邮港澳台
2018/01/31 全球购物
澳大利亚家具和家居用品购物网站:Zanui
2018/12/29 全球购物
PatPat香港:婴童服饰和亲子全家装在线购物
2020/09/27 全球购物
奥巴马经典演讲稿
2014/09/13 职场文书
大学生翘课检讨书范文
2014/10/06 职场文书
2016年寒假社会实践活动总结
2015/03/27 职场文书
养成教育工作总结
2015/08/13 职场文书
java固定大小队列的几种实现方式详解
2021/07/15 Java/Android
JMeter对MySQL数据库进行压力测试的实现步骤
2022/01/22 MySQL