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 相关文章推荐
JavaScript和ActionScript的交互实现代码
Aug 01 Javascript
JavaScript 学习历程和心得分享
Dec 12 Javascript
jQuery 中$(this).index与$.each的使用指南
Nov 20 Javascript
在JavaScript的jQuery库中操作AJAX的方法讲解
Aug 15 Javascript
ajax级联菜单实现方法实例分析
Nov 28 Javascript
Bootstrap CSS组件之分页(pagination)和翻页(pager)
Dec 17 Javascript
canvas知识总结
Jan 25 Javascript
js下拉菜单生成器dropMenu使用方法详解
Aug 01 Javascript
原生JS实现多个小球碰撞反弹效果示例
Jan 31 Javascript
利用CDN加速react webpack打包后的文件详解
Feb 22 Javascript
vue-cli3环境变量与分环境打包的方法示例
Feb 18 Javascript
vue 根据选择的月份动态展示日期对应的星期几
Feb 06 Vue.js
详解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加密扩展库Mcrypt安装和实例
2013/11/10 PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
2016/07/13 PHP
如何使用php等比例缩放图片
2016/10/12 PHP
PHP中功能强大却很少使用的函数实例小结
2016/11/10 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
Lumen timezone 时区设置方法(慢了8个小时)
2018/01/20 PHP
让人期待的2011年度最佳 jQuery 插件分享
2012/03/16 Javascript
jQuery对html元素取值与赋值的方法
2013/11/20 Javascript
JavaScript数据结构与算法之栈详解
2015/03/12 Javascript
jQuery取消ajax请求的方法
2015/06/09 Javascript
jQuery如何跳转到另一个网页 就这么简单
2016/12/28 Javascript
JS传参及动态修改页面布局
2017/04/13 Javascript
使用重写url机制实现验证码换一张功能
2017/08/01 Javascript
Angular4表单验证代码详解
2017/09/03 Javascript
JavaScript实现获取select下拉框中第一个值的方法
2018/02/06 Javascript
浅谈webpack打包之后的文件过大的解决方法
2018/03/07 Javascript
使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的组件(推荐)
2018/05/01 Javascript
Vue 引入AMap高德地图的实现代码
2019/04/29 Javascript
Python数据结构与算法之图的基本实现及迭代器实例详解
2017/12/12 Python
Python使用pylab库实现绘制直方图功能示例
2018/06/01 Python
python K近邻算法的kd树实现
2018/09/06 Python
Python列表list排列组合操作示例
2018/12/18 Python
python增加图像对比度的方法
2019/07/12 Python
详解使用Python下载文件的几种方法
2019/10/13 Python
Python运行异常管理解决方案
2020/03/09 Python
matplotlib绘制多子图共享鼠标光标的方法示例
2021/01/08 Python
英国网上花店:Bunches
2016/11/29 全球购物
Zavvi美国:英国娱乐之家
2017/03/19 全球购物
2014卖家双十一活动策划书
2014/09/29 职场文书
党的群众路线教育实践活动个人整改落实情况汇报
2014/10/28 职场文书
邀请函范文
2015/02/02 职场文书
复试通知单模板
2015/04/24 职场文书
KTV员工管理制度
2015/08/06 职场文书
2016幼儿园新学期寄语
2015/12/03 职场文书
SQL实现LeetCode(177.第N高薪水)
2021/08/04 MySQL
Elasticsearch 数据类型及管理
2022/04/19 Python