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 相关文章推荐
如何用js控制css中的float的代码
Aug 16 Javascript
jQuery 工具函数学习资料
Apr 29 Javascript
利用JS判断用户是否上网(连接网络)
Dec 23 Javascript
JavaScript输出当前时间Unix时间戳的方法
Apr 06 Javascript
JavaScript实现的伸展收缩型菜单代码
Oct 14 Javascript
js与applet相互调用的方法
Jun 22 Javascript
jQuery中get方法用法分析
Dec 07 Javascript
基于jQuery的表单填充实例
Aug 22 jQuery
JSON创建键值对(key是中文或者数字)方式详解
Aug 24 Javascript
create-react-app 修改为多入口编译的方法
Aug 01 Javascript
vue中slot(插槽)的介绍与使用
Nov 12 Javascript
详解基于原生JS验证表单组件xy-form
Aug 20 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
玩转图像函数库―常见图形操作
2006/09/03 PHP
smarty实例教程
2006/11/19 PHP
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
2006/12/06 PHP
关于PHP的相似度计算函数:levenshtein的使用介绍
2013/04/15 PHP
PHP开发注意事项总结
2015/02/04 PHP
PHP实现带进度条的Ajax文件上传功能示例
2019/07/02 PHP
零基础学JavaScript最新动画教程+iso光盘下载
2008/01/22 Javascript
js实现带按钮的上下滚动效果
2015/05/12 Javascript
js实现全国省份城市级联下拉菜单效果代码
2015/09/07 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
BootStrap Datetimepicker 汉化的实现代码
2017/02/10 Javascript
整理关于Bootstrap表单的慕课笔记
2017/03/29 Javascript
关于使用js算总价的问题
2017/06/23 Javascript
微信小程序 开发MAP(地图)实例详解
2017/06/27 Javascript
微信小程序实现动态改变view标签宽度和高度的方法【附demo源码下载】
2017/12/05 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
2018/04/26 jQuery
JS中通过url动态获取图片大小的方法小结(两种方法)
2018/10/31 Javascript
微信小程序实现获取小程序码和二维码java接口开发
2019/03/29 Javascript
vue实现分页加载效果
2019/12/24 Javascript
[08:53]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS 选手采访
2021/03/11 DOTA
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
2017/11/23 Python
python for循环remove同一个list过程解析
2019/08/14 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
2019/10/17 Python
python scrapy重复执行实现代码详解
2019/12/28 Python
python中pyplot基础图标函数整理
2020/11/10 Python
用OpenCV进行年龄和性别检测的实现示例
2021/01/29 Python
英国乐购杂货:Tesco Groceries
2018/11/29 全球购物
三个Unix的命令面试题
2015/04/12 面试题
小学家长会邀请函
2014/01/23 职场文书
兴趣小组活动总结
2014/05/05 职场文书
物业总经理助理岗位职责
2014/06/29 职场文书
毕业证丢失证明范本
2014/09/20 职场文书
交通事故委托书范本
2014/09/28 职场文书
两行代码解决Jupyter Notebook中文不能显示的问题
2021/04/24 Python
JavaScript 数组去重详解
2021/09/15 Javascript
Python turtle编写简单的球类小游戏
2022/03/31 Python