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 相关文章推荐
关于COOKIE个数与大小的问题
Jan 17 Javascript
js 第二代身份证号码的验证机制代码
May 12 Javascript
SinaEditor使用方法详解
Dec 28 Javascript
通过js为元素添加多项样式,浏览器全兼容写法
Aug 30 Javascript
JS判断是否长按某一键的方法
Mar 02 Javascript
ECMAScript6快速入手攻略
Jul 18 Javascript
火狐和ie下获取javascript 获取event的方法(推荐)
Nov 26 Javascript
webpack 1.x升级过程中的踩坑总结大全
Aug 09 Javascript
Angular2.0/4.0 使用Echarts图表的示例代码
Dec 07 Javascript
Angular4学习教程之HTML属性绑定的方法
Jan 04 Javascript
深入了解javascript 数组的sort方法
Jun 01 Javascript
微信小程序进入广告实现代码实例
Sep 19 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 进程锁定问题分析研究
2009/11/24 PHP
Discuz!下Memcache缓存实现方法
2010/05/28 PHP
php+jQuery.uploadify实现文件上传教程
2014/12/26 PHP
php ajax实现文件上传进度条
2016/03/29 PHP
JavaScript学习笔记记录我的旅程
2012/05/23 Javascript
获取数组中最大最小值方法js代码(自写)
2013/08/12 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
2013/09/25 Javascript
js中iframe调用父页面的方法
2014/10/30 Javascript
用Node.js通过sitemap.xml批量抓取美女图片
2015/05/28 Javascript
简介AngularJS的视图功能应用
2015/06/17 Javascript
jQuery的end()方法使用详解
2015/07/15 Javascript
layui弹出层效果实现代码
2017/05/19 Javascript
微信小程序webview 脚手架使用详解
2019/07/22 Javascript
[02:14]2016国际邀请赛中国区预选赛Ehome晋级之路
2016/07/01 DOTA
[54:30]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python中定义结构体的方法
2013/03/04 Python
利用PyInstaller将python程序.py转为.exe的方法详解
2017/05/03 Python
利用python实现简单的邮件发送客户端示例
2017/12/23 Python
python获取时间及时间格式转换问题实例代码详解
2018/12/06 Python
python 列表转为字典的两个小方法(小结)
2019/06/28 Python
将tensorflow模型打包成PB文件及PB文件读取方式
2020/01/23 Python
Python 跨.py文件调用自定义函数说明
2020/06/01 Python
浅析Python 多行匹配模式
2020/07/24 Python
python 用Matplotlib作图中有多个Y轴
2020/11/28 Python
利用python查看数组中的所有元素是否相同
2021/01/08 Python
如何用canvas实现在线签名的示例代码
2018/07/10 HTML / CSS
幼儿园春游活动方案
2014/01/19 职场文书
怎么写自荐书范文
2014/02/12 职场文书
小学优秀班主任事迹材料
2014/05/17 职场文书
工地安全质量标语
2014/06/07 职场文书
2014年庆祝国庆65周年演讲稿
2014/09/21 职场文书
煤矿安全保证书
2015/02/27 职场文书
综合测评自我评价
2015/03/06 职场文书
tensorflow学习笔记之tfrecord文件的生成与读取
2021/03/31 Python
《杜鹃的婚约》OP主题曲「凸凹」无字幕影像公开
2022/04/08 日漫
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL