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 相关文章推荐
Javascript中的Split使用方法与技巧
Mar 09 Javascript
基于jquery 的一个progressbar widge
Oct 29 Javascript
jquery each()源代码
Feb 14 Javascript
自己用jQuery写了一个图片的马赛克消失效果
May 04 Javascript
跟我学习javascript的严格模式
Nov 16 Javascript
Bootstrap被封装的弹层
Jul 20 Javascript
js实现鼠标拖拽多选功能示例
Aug 01 Javascript
详解使用Visual Studio Code对Node.js进行断点调试
Sep 14 Javascript
Vue.js 的移动端组件库mint-ui实现无限滚动加载更多的方法
Dec 23 Javascript
vue实现鼠标移入移出事件代码实例
Mar 27 Javascript
关于layui toolbar和template的结合使用方法
Sep 19 Javascript
用JS实现飞机大战小游戏
Jun 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
smarty实现多级分类的方法
2014/12/05 PHP
CI框架简单邮件发送类实例
2016/05/18 PHP
详解Laravel视图间共享数据与视图Composer
2016/08/04 PHP
微信网页授权(OAuth2.0) PHP 源码简单实现
2016/08/29 PHP
js 面向对象的技术创建高级 Web 应用程序
2010/02/25 Javascript
jquery 打开窗口返回值实现代码
2010/03/04 Javascript
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
JS读取cookies信息(记录用户名)
2012/01/10 Javascript
jQuery插件的写法分享
2013/06/12 Javascript
jquery 获取dom固定元素 添加样式的简单实例
2014/02/04 Javascript
jQuery学习笔记之jQuery.extend(),jQuery.fn.extend()分析
2014/06/09 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
2016/04/07 Javascript
浅析Vue中method与computed的区别
2018/03/06 Javascript
javascript实现动态时钟的启动和停止
2020/07/29 Javascript
Vue实现图片与文字混输效果
2019/12/04 Javascript
jQuery实现移动端扭蛋机抽奖
2020/11/08 jQuery
python将xml xsl文件生成html文件存储示例讲解
2013/12/03 Python
python计算书页码的统计数字问题实例
2014/09/26 Python
Python3访问并下载网页内容的方法
2015/07/28 Python
python matplotlib坐标轴设置的方法
2017/12/05 Python
Python排序算法之选择排序定义与用法示例
2018/04/29 Python
pandas 快速处理 date_time 日期格式方法
2018/11/12 Python
python 基于TCP协议的套接字编程详解
2019/06/29 Python
Pytorch实现的手写数字mnist识别功能完整示例
2019/12/13 Python
Python3列表List入门知识附实例
2020/02/09 Python
深入浅析python的第三方库pandas
2020/02/13 Python
树莓派升级python的具体步骤
2020/07/05 Python
html5本地存储 localStorage操作使用详解
2016/09/20 HTML / CSS
英国顶级家庭折扣店:The Works
2017/09/06 全球购物
POS解决方案:MUNBYN(热敏打印机、条形码扫描仪)
2020/06/09 全球购物
Java多态性的定义以及类型
2014/09/16 面试题
《灰椋鸟》教学反思
2014/04/27 职场文书
出国签证在职证明
2014/09/20 职场文书
销售员岗位职责
2015/02/10 职场文书
新农村建设指导员工作总结
2015/08/13 职场文书
SQL解决未能删除约束问题drop constraint
2022/05/30 SQL Server