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 相关文章推荐
jQuery中:focus选择器用法实例
Dec 30 Javascript
js实现图片无缝滚动特效
Mar 19 Javascript
JavaScript小技巧整理篇(非常全)
Jan 26 Javascript
jQuery+HTML5实现弹出创意搜索框层
Dec 29 Javascript
js原生代码实现轮播图的实例讲解
Jul 28 Javascript
js注册时输入合法性验证方法
Oct 21 Javascript
JS实现可切换图片的幻灯切换效果示例
May 24 Javascript
javascript实现图片轮播代码
Jul 09 Javascript
vue自定义switch开关组件,实现样式可自行更改
Nov 01 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
Jul 14 jQuery
解决Vue中使用keepAlive不缓存问题
Aug 04 Javascript
小程序实现密码输入框
Nov 16 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的加密方式及原理
2012/06/14 PHP
示例详解Laravel的注册重构
2016/08/14 PHP
ThinkPHP中图片按比例切割的代码实例
2019/03/08 PHP
ExtJS 2.0实用简明教程 之Border区域布局
2009/04/29 Javascript
基于jQuery的倒计时插件代码
2011/05/07 Javascript
javascript 手动给表增加数据的小例子
2013/07/10 Javascript
脚本合并提升javascript性能示例
2014/02/24 Javascript
Jquery实现兼容各大浏览器的Enter回车切换输入焦点的方法
2014/09/01 Javascript
Javascript表单验证要注意的事项
2014/09/29 Javascript
JavaScript设计模式之装饰者模式介绍
2014/12/28 Javascript
JavaScript中的console.assert()函数介绍
2014/12/29 Javascript
EasyUi datagrid 实现表格分页
2015/02/10 Javascript
浅析jQuery 遍历函数,javascript中的each遍历
2016/05/25 Javascript
BootStrap轻松实现微信页面开发代码分享
2016/10/21 Javascript
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
2017/03/09 Javascript
Python编写检测数据库SA用户的方法
2014/07/11 Python
详解Python中DOM方法的动态性
2015/04/11 Python
python的继承知识点总结
2018/12/10 Python
Python批量删除只保留最近几天table的代码实例
2019/04/01 Python
python三大神器之fabric使用教程
2019/06/10 Python
使用Python将字符串转换为格式化的日期时间字符串
2019/09/01 Python
sklearn-SVC实现与类参数详解
2019/12/10 Python
Pandas —— resample()重采样和asfreq()频度转换方式
2020/02/26 Python
Python try except异常捕获机制原理解析
2020/04/18 Python
Mysql数据库反向生成Django里面的models指令方式
2020/05/18 Python
Python基于Twilio及腾讯云实现国际国内短信接口
2020/06/18 Python
python 用opencv实现图像修复和图像金字塔
2020/11/27 Python
一款利用html5和css3实现的3D滚动特效的教程
2015/01/04 HTML / CSS
详解html5页面 rem 布局适配方法
2018/01/12 HTML / CSS
安全大检查反思材料
2014/01/31 职场文书
学习两会精神心得范文
2014/03/17 职场文书
亲属关系公证书
2014/04/08 职场文书
护士年终个人总结
2015/02/13 职场文书
大专护理专业自荐信
2015/03/25 职场文书
Laravel中获取IP的真实地理位置
2021/04/01 PHP
Mysql - 常用函数 每天积极向上
2021/04/05 MySQL