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 相关文章推荐
建立良好体验度的Web注册系统ajax
Jul 09 Javascript
JQUERY THICKBOX弹出层插件
Aug 30 Javascript
基于JQuery 选择器使用说明介绍
Apr 18 Javascript
基于jQuery实现点击列表加载更多效果
May 31 Javascript
你不需要jQuery(三) 新AJAX方法fetch()
Jun 14 Javascript
从零学习node.js之mysql数据库的操作(五)
Feb 24 Javascript
浅谈ajax在jquery中的请求和servlet中的响应
Jan 22 jQuery
在vue中,v-for的索引index在html中的使用方法
Mar 06 Javascript
SVG实现时钟效果
Jul 17 Javascript
生产制造追溯系统之在线打印功能
Jun 03 Javascript
详解微信小程序工程化探索之webpack实战
Apr 20 Javascript
基于JS实现视频上传显示进度条
May 12 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 ci框架中加载css和js文件失败的解决方法
2014/03/03 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
IE中jscript/javascript的条件编译
2006/09/07 Javascript
JQuery页面的表格数据的增加与分页的实现
2013/12/10 Javascript
Javascript动态引用CSS文件的2种方法介绍
2014/06/06 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
vue指令以及dom操作详解
2017/03/04 Javascript
基于JS脚本语言的基础语法详解
2017/07/22 Javascript
vue自定义过滤器创建和使用方法详解
2017/11/06 Javascript
JavaScript中为事件指定处理程序的五种方式分析
2018/07/27 Javascript
利用Blob进行文件上传的完整步骤
2018/08/02 Javascript
VUE预渲染及遇到的坑
2018/09/03 Javascript
bootstrap与pagehelper实现分页效果
2018/12/29 Javascript
在Vue项目中,防止页面被缩放和放大示例
2019/10/28 Javascript
vuex actions异步修改状态的实例详解
2019/11/06 Javascript
Node.js API详解之 Error模块用法实例分析
2020/05/14 Javascript
Python实现对一个函数应用多个装饰器的方法示例
2018/02/09 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
python 画3维轨迹图并进行比较的实例
2019/12/06 Python
python Qt5实现窗体跟踪鼠标移动
2019/12/13 Python
python+selenium+Chrome options参数的使用
2020/03/18 Python
python 如何调用 dubbo 接口
2020/09/24 Python
CSS3实现千变万化的文字阴影text-shadow效果设计
2016/04/26 HTML / CSS
HTML5 Canvas实现烟花绽放特效
2016/03/02 HTML / CSS
Clearly新西兰:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
日本索尼音乐商店:Sony Music Shop
2018/07/17 全球购物
食堂员工工作职责
2013/12/18 职场文书
班级道德讲堂实施方案
2014/02/24 职场文书
责任担保书范文
2014/05/21 职场文书
经贸日语专业自荐信
2014/09/02 职场文书
2014年重阳节敬老活动方案
2014/09/16 职场文书
公司租房协议书范本
2014/10/08 职场文书
力克胡哲观后感
2015/06/10 职场文书
2016年幼儿园万圣节活动总结
2016/04/05 职场文书
情况说明书格式及范文
2019/06/24 职场文书