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 相关文章推荐
网页里控制图片大小的相关代码
Jun 25 Javascript
多种方法实现JS动态添加事件
Nov 01 Javascript
js如何设置在iframe框架中指定div不显示
Dec 04 Javascript
JavaScript作用域与作用域链深入解析
Dec 06 Javascript
iframe子页面与父页面在同域或不同域下的js通信
May 07 Javascript
js和jquery中循环的退出和继续下一个循环
Sep 03 Javascript
微信小程序 rpx 尺寸单位详细介绍
Oct 13 Javascript
Vue 中对图片地址进行拼接的方法
Sep 03 Javascript
JS 实现微信扫一扫功能
Sep 14 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
Sep 14 Javascript
微信小程序实现简单评论功能
Nov 28 Javascript
vue实现移动端项目多行文本溢出省略
Jul 29 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
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
2007/03/29 PHP
php inc文件使用的风险和注意事项
2013/11/12 PHP
PHP实现链式操作的原理详解
2016/09/16 PHP
php将文件夹打包成zip文件的简单实现方法
2016/10/04 PHP
laravel orm 关联条件查询代码
2019/10/21 PHP
javascript仿php的print_r函数输出json数据
2013/09/13 Javascript
页面按钮禁用与解除禁用的方法
2014/02/19 Javascript
js实现弹出窗口、页面变成灰色并不可操作的例子分享
2014/05/10 Javascript
浅谈Javascript 数组与字典
2015/01/29 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
2015/04/03 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
2015/09/14 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
AngularJS 路由详解和简单实例
2016/07/28 Javascript
js实现右键菜单功能
2016/11/28 Javascript
纯js实现悬浮按钮组件
2016/12/17 Javascript
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
新手快速入门微信小程序组件库 iView Weapp
2019/06/24 Javascript
详解element-ui级联菜单(城市三级联动菜单)和回显问题
2019/10/02 Javascript
[39:02]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs VGJ.T
2018/04/01 DOTA
python编程开发之textwrap文本样式处理技巧
2015/11/13 Python
Python的MongoDB模块PyMongo操作方法集锦
2016/01/05 Python
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
2017/05/08 Python
Python+OpenCV实现车牌字符分割和识别
2018/03/31 Python
Python WSGI的深入理解
2018/08/01 Python
python re模块匹配贪婪和非贪婪模式详解
2020/02/11 Python
pandas中的ExcelWriter和ExcelFile的实现方法
2020/04/24 Python
python 数据分析实现长宽格式的转换
2020/05/18 Python
python 解决Fatal error in launcher:错误问题
2020/05/21 Python
html5/css3响应式页面开发总结
2018/10/16 HTML / CSS
详解WebSocket跨域问题解决
2018/08/06 HTML / CSS
HTML5新标签兼容——&gt; 的两种方法
2018/09/12 HTML / CSS
Boutique 1美国:阿联酋奢侈时尚零售商
2017/10/16 全球购物
财务总监管理岗位职责
2014/03/08 职场文书
本科毕业生自荐信
2014/06/02 职场文书
煤矿安全生产月活动总结
2014/07/05 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书