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 相关文章推荐
Ext javascript建立超链接,进行事件处理的实现方法
Mar 22 Javascript
IE8下关于querySelectorAll()的问题
May 13 Javascript
使用jquery为table动态添加行的实现代码
Mar 30 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
Sep 17 Javascript
前端框架学习总结之Angular、React与Vue的比较详解
Mar 14 Javascript
AngularJS实现的回到顶部指令功能实例
May 17 Javascript
Angular 1.x个人使用的经验小结
Jul 19 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
Oct 20 Javascript
vue动态注册组件实例代码详解
May 30 Javascript
微信小程序通过一个json实现分享朋友圈图片
Sep 03 Javascript
vue实现抖音时间转盘
Sep 08 Javascript
Nuxt的动态路由和参数校验操作
Nov 09 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函数分享之curl方式取得数据、模拟登陆、POST数据
2014/06/04 PHP
PHP批量查询WordPress留言者E-mail地址实现方法
2015/02/15 PHP
解决php的“It is not safe to rely on the system’s timezone settings”问题
2015/10/08 PHP
PHP 实现的将图片转换为TXT
2015/10/21 PHP
配置Nginx+PHP的正确思路与过程
2016/05/10 PHP
header与缓冲区之间的深层次分析
2016/07/30 PHP
Yii2框架加载css和js文件的方法分析
2019/05/25 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
如何在PHP环境中使用ProtoBuf数据格式
2020/06/19 PHP
php析构函数的具体用法小结
2014/03/11 Javascript
浅谈nodeName,nodeValue,nodeType,typeof 的区别
2015/01/13 Javascript
JavaScript中String.match()方法的使用详解
2015/06/06 Javascript
深入浅析JavaScript系列(13):This? Yes,this!
2016/01/05 Javascript
微信小程序 基础知识css样式media标签
2017/02/15 Javascript
AngularJS入门教程一:路由用法初探
2017/05/27 Javascript
vue 标签属性数据绑定和拼接的实现方法
2018/05/17 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
2018/09/25 Javascript
Angular 中使用 FineReport不显示报表直接打印预览
2019/08/21 Javascript
JavaScript实现多层颜色选项卡嵌套
2020/09/21 Javascript
[01:17]Ti4 循环赛第一日回顾
2014/07/11 DOTA
Python中random模块用法实例分析
2015/05/19 Python
Python切换pip安装源的方法详解
2016/11/18 Python
Python3 实现随机生成一组不重复数并按行写入文件
2018/04/09 Python
Python3.6简单反射操作示例
2018/06/14 Python
python中for循环输出列表索引与对应的值方法
2018/11/07 Python
Pycharm取消py脚本中SQL识别的方法
2018/11/29 Python
python http基本验证方法
2018/12/26 Python
Python实现滑动平均(Moving Average)的例子
2019/08/24 Python
IE9下html5初试小刀
2010/09/21 HTML / CSS
网络编辑岗位职责
2014/03/18 职场文书
保险公司年会主持词
2014/03/22 职场文书
人事专员岗位说明书
2014/07/29 职场文书
试用期员工工作自我评价
2014/09/10 职场文书
北京英文导游词
2015/02/12 职场文书
酒店员工手册范本
2015/05/14 职场文书
Python制作一个随机抽奖小工具的实现
2021/07/07 Python