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代码
Dec 15 Javascript
jquery+ashx无刷新GridView数据显示插件(实现分页、排序、过滤功能)
Apr 25 Javascript
jQuery插件 selectToSelect使用方法
Oct 02 Javascript
JS截取字符串常用方法整理及使用示例
Oct 18 Javascript
js 调用百度地图api并在地图上进行打点添加标注
May 13 Javascript
Javascript让DEDECMS告别手写Tag
Sep 01 Javascript
基于Arcgis for javascript实现百度地图ABCD marker的效果
Sep 12 Javascript
JavaScript中iframe实现局部刷新的几种方法汇总
Jan 06 Javascript
AngularJS实现路由实例
Feb 12 Javascript
JavaScript实现短信倒计时60s
Oct 09 Javascript
axios+Vue实现上传文件显示进度功能
Apr 14 Javascript
jQuery 动态粒子效果示例代码
Jul 07 jQuery
详解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
第九节 绑定 [9]
2006/10/09 PHP
谈谈PHP连接Access数据库的注意事项
2016/08/12 PHP
Thinkphp5结合layer弹窗定制操作结果页面
2017/07/07 PHP
Date对象格式化函数代码
2010/07/17 Javascript
javascript使用activex控件的代码
2011/01/27 Javascript
解析Jquery取得iframe中元素的几种方法
2013/07/04 Javascript
JavaScript学习笔记之内置对象
2015/01/22 Javascript
javascript实现点击按钮弹出一个可关闭层窗口同时网页背景变灰的方法
2015/05/13 Javascript
NodeJs读取JSON文件格式化时的注意事项
2016/09/25 NodeJs
Vue配合iView实现省市二级联动的示例代码
2018/07/27 Javascript
element-ui使用导航栏跳转路由的用法详解
2018/08/22 Javascript
Vue Cli3 创建项目的方法步骤
2018/10/15 Javascript
vue 实现通过vuex 存储值 在不同界面使用
2019/11/11 Javascript
vue 通过 Prop 向子组件传递数据的实现方法
2020/10/30 Javascript
vue点击Dashboard不同内容 跳转到同一表格的实例
2020/11/13 Javascript
Python实现自动登录百度空间的方法
2017/06/10 Python
Django之使用celery和NGINX生成静态页面实现性能优化
2019/10/08 Python
pygame编写音乐播放器的实现代码示例
2019/11/19 Python
python opencv圆、椭圆与任意多边形的绘制实例详解
2020/02/06 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
2020/03/03 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
2020/08/07 Python
python3代码中实现加法重载的实例
2020/12/03 Python
HTML5+Canvas+CSS3实现齐天大圣孙悟空腾云驾雾效果
2016/04/26 HTML / CSS
Maje德国官网:法国女性成衣品牌
2017/02/10 全球购物
毕业研究生的自我鉴定
2013/11/30 职场文书
十岁生日家长答谢词
2014/01/17 职场文书
高中生期末评语
2014/01/28 职场文书
演讲比赛获奖感言
2014/02/02 职场文书
创业计划实施的7大步骤
2014/02/05 职场文书
中文专业学生自我评价范文
2014/02/06 职场文书
团队口号大全
2014/06/06 职场文书
2016年“我们的节日·端午节”活动总结
2016/04/01 职场文书
范文之农村基层党建工作报告
2019/10/24 职场文书
如何使用Maxwell实时同步mysql数据
2021/04/08 MySQL
JavaScript+HTML实现学生信息管理系统
2021/04/20 Javascript
Python基础之数据结构详解
2021/04/28 Python