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 相关文章推荐
splice slice区别
Oct 09 Javascript
关于jquery css的使用介绍
Apr 18 Javascript
jquery层级选择器(匹配父元素下的子元素实现代码)
Sep 05 Javascript
vue响应式更新机制及不使用框架实现简单的数据双向绑定问题
Jun 27 Javascript
thinkjs微信中控之微信鉴权登陆的实现代码
Aug 08 Javascript
使用layui+ajax实现简单的菜单权限管理及排序的方法
Sep 10 Javascript
使用 UniApp 实现小程序的微信登录功能
Jun 09 Javascript
浏览器JavaScript调试功能无法使用解决方案
Sep 18 Javascript
通过实例了解Render Props回调地狱解决方案
Nov 04 Javascript
ant design的table组件实现全选功能以及自定义分页
Nov 17 Javascript
为什么node.js不适合大型项目
Apr 28 Javascript
深入理解Vue的数据响应式
May 15 Vue.js
详解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防注入安全代码
2008/04/09 PHP
PHP实现的简单适配器模式示例
2017/06/22 PHP
PHP使用redis位图bitMap 实现签到功能
2019/10/08 PHP
推荐11款jQuery开发的复选框和单选框美化插件
2011/08/02 Javascript
JAVASCRIPT模式窗口中下载文件无法接收iframe的流
2013/10/11 Javascript
JavaScript之IE的fireEvent方法详细解析
2013/11/20 Javascript
JSuggest自动匹配下拉框使用方法(示例代码)
2013/12/27 Javascript
利用javascript实现全部删或清空所选的操作
2014/05/27 Javascript
js调试系列 源码定位与调试[基础篇]
2014/06/18 Javascript
用javascript关闭本窗口技巧小结
2014/09/05 Javascript
JavaScript获取表单enctype属性的方法
2015/04/02 Javascript
在JavaScript中操作数组之map()方法的使用
2015/06/09 Javascript
很棒的js选项卡切换效果
2016/07/15 Javascript
JS控制静态页面传递参数并获取参数应用
2016/08/10 Javascript
Bootstrap作品展示站点实战项目2
2016/10/14 Javascript
详解vue-validator(vue验证器)
2017/01/16 Javascript
jQuery实现文档树效果
2017/02/20 Javascript
React diff算法的实现示例
2018/04/20 Javascript
详解JavaScript中的链式调用
2020/11/27 Javascript
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
Python使用PIL模块生成随机验证码
2017/11/21 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
2018/04/02 Python
2019 Python最新面试题及答案16道题
2019/04/11 Python
python字符串切割:str.split()与re.split()的对比分析
2019/07/16 Python
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
威尔逊皮革:Wilsons Leather
2018/12/07 全球购物
日本热销NO.1胶原蛋白冻:Aishitoto爱希特多
2019/06/20 全球购物
会计的岗位职责
2014/03/15 职场文书
卖车协议书
2014/04/21 职场文书
本科生就业推荐信
2014/05/19 职场文书
科学发展观活动总结
2014/08/28 职场文书
学校师德师风整改措施
2014/10/27 职场文书
2015年八一建军节活动总结
2015/03/20 职场文书
php访问对象中的成员的实例方法
2021/11/17 PHP
Java生成日期时间存入Mysql数据库的实现方法
2022/03/03 Java/Android
错误码NET::ERR_CERT_DATE_INVALID证书已过期解决方法?
2022/07/07 数码科技