Vue.js 实现微信公众号菜单编辑器功能(一)


Posted in Javascript onMay 08, 2018

学习一段时间Vue.js,于是想尝试着做一个像微信平台里那样的菜单编辑器,在这里分享下

具体样式代码查看项目github

创建一个vue实例

<!DOCTYPE html>
<html>
<head>
 <meta charset="UTF-8">
 <title></title>
 <script src="https://cdn.bootcss.com/vue/2.5.9/vue.js"></script>
</head>
<body>
 <div class="content" style="width:900px;margin:0 auto;">
 <!-- vue实例挂载的DOM元素 -->
 <div id="app-menu">
 <!-- 菜单预览界面 -->
 <div class="weixin-preview"></div>
 <!-- 菜单编辑界面 -->
 <div class="weixin-menu-detail"></div>
 </div>
 </div>
 <script>
 var app = new Vue({
 el: '#app-menu',//挂载到对应的DOM元素
 data: {
 weixinTitle: 'Vue.js公众号菜单',
 //菜单对象
 menu: {
  "button": [
  {
  "name": "主菜单1",
  "sub_button": []
  },
  {
  "name": "主菜单2",
  "sub_button": []
  },
  {
  "name": "主菜单3",
  "sub_button": [
  {
  "name": "子菜单1"
  }]
  }]
 },
 selectedMenuIndex:'',//当前选中菜单索引
 selectedSubMenuIndex:'',//当前选中子菜单索引
 },
 methods: {
 }
 })
 </script>
</body>
</html>

Vue.js 实现微信公众号菜单编辑器功能(一)

将菜单数据渲染到模版上

这里使用v-if和v-for将数据渲染到模版上,最多会有3个主菜单以及每个主菜单最多会有5个子菜单。

<div class="weixin-preview">
 <div class="weixin-hd">
 <div class="weixin-title">{{weixinTitle}}</div>
 </div>
 <div class="weixin-bd">
 <ul class="weixin-menu">
 <!-- 这里使用v-for开始循环主菜单 -->
 <li v-for="(btn,i) in menu.button" class="menu-item">
 <div class="menu-item-title">
  <span>{{ btn.name }}</span>
 </div>
 <ul class="weixin-sub-menu">
  <!-- 这里使用v-for开始循环主菜单下的子菜单 -->
  <li v-for="(sub,i2) in btn.sub_button" class="menu-sub-item">
  <div class="menu-item-title">
  <span>{{sub.name}}</span>
  </div>
  </li>
  <!-- 这里使用v-if 判断子菜单小于5个,则添加按钮来添加子菜单 -->
  <li v-if="btn.sub_button.length<5" class="menu-sub-item">
  <div class="menu-item-title">
  <i class="icon14_menu_add"></i>
  </div>
  </li>
 </ul>
 </li>
 <!-- 这里使用v-if 判断主菜单小于3个,则添加按钮来添加主菜单 -->
 <li class="menu-item" v-if="menu.button.length<3"> <i class="icon14_menu_add"></i></li>
 </ul>
 </div>
</div>

Vue.js 实现微信公众号菜单编辑器功能(一)

给vue实例添加方法

在vue实例中给methods对象中添加我们自定义的方法

methods: {
 //选中主菜单
 selectedMenu:function (i) {
 this.selectedSubMenuIndex = ''
 this.selectedMenuIndex = i
 },
 //选中子菜单
 selectedSubMenu:function (i) {
 this.selectedSubMenuIndex = i
 },
 //选中菜单级别
 selectedMenuLevel: function () {
 if (this.selectedMenuIndex !== '' && this.selectedSubMenuIndex === '') {
 //主菜单
 return 1;
 } else if (this.selectedMenuIndex !== '' && this.selectedSubMenuIndex !== '') {
 //子菜单
 return 2;
 } else {
 //未选中任何菜单
 return 0;
 }
 },
 //添加菜单 
 //参数level为菜单级别,1为主菜单、2为子菜单
 addMenu:function (level) {
 if (level == 1 && this.menu.button.length < 3) {
 this.menu.button.push({"name": "菜单名称",
 "sub_button": []
 })
 this.selectedMenuIndex = this.menu.button.length - 1
 this.selectedSubMenuIndex = ''
 }
 if (level == 2 && this.menu.button[this.selectedMenuIndex].sub_button.length < 5) {
 this.menu.button[this.selectedMenuIndex].sub_button.push({
 "name": "子菜单名称"
 })
 this.selectedSubMenuIndex = this.menu.button[this.selectedMenuIndex].sub_button.length - 1
 }
 }
}

给菜单绑定方法

当点击菜单触发selectedMenu方法,点击添加按钮触发添加addMenu方法。使用v-on来监听事件,它的缩写是@

监听点击事件@click ,为了防止子菜单点击事件冒泡的主菜单,则使用.stop事件修饰符来阻止冒泡@click.stop

使用v-bind:class来添加切换菜单选中时的class。:class为缩写

<ul class="weixin-menu" id="weixin-menu" >
 <!-- 判断如果selectedMenuIndex是当前点击的主菜单索引则添加current样式 -->
 <li v-for="(btn,i) in menu.button" class="menu-item" :class="{current:selectedMenuIndex===i&&selectedMenuLevel()==1}" @click="selectedMenu(i)">
 <div class="menu-item-title">
 <span>{{ btn.name }}</span>
 </div>
 <!-- v-show来切换是否显示 这里如果选中了主菜单则子菜单弹出 -->
 <ul class="weixin-sub-menu" v-show="selectedMenuIndex===i">
 <li v-for="(sub,i2) in btn.sub_button" class="menu-sub-item" :class="{current:selectedSubMenuIndex===i2&&selectedMenuLevel()==2}" @click.stop="selectedSubMenu(i2)">
 <div class="menu-item-title">
  <span>{{sub.name}}</span>
 </div>
 </li>
 <li v-if="btn.sub_button.length<5" class="menu-sub-item" @click.stop="addMenu(2)">
  <div class="menu-item-title">
  <i class="icon14_menu_add"></i>
  </div>
 </li>
 </ul>
 </li>
 <li class="menu-item" v-if="menu.button.length<3" @click="addMenu(1)">
 <i class="icon14_menu_add"></i>
 </li>
</ul>

Vue.js 实现微信公众号菜单编辑器功能(一)

下篇给大家介绍  Vue.js 实现微信公众号菜单编辑器功能(二)    

总结

以上所述是小编给大家介绍的Vue.js 实现微信公众号菜单编辑器功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Array.slice()与Array.splice()的返回值类型
Oct 09 Javascript
javascript来定义类的规范小结
Nov 19 Javascript
由点击页面其它地方隐藏div所想到的jQuery的delegate
Aug 29 Javascript
jquery实现个人中心导航菜单效果和美观都非常不错
Sep 02 Javascript
Prototype框架详解
Nov 25 Javascript
多种JQuery循环滚动文字图片效果代码
Jun 23 Javascript
jQuery实现简单滚动动画效果
Apr 07 Javascript
HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)
May 25 Javascript
JavaScript简单下拉菜单特效
Sep 13 Javascript
简单实现js鼠标跟随效果
Aug 02 Javascript
Vue DevTools调试工具的使用
Dec 05 Javascript
详解jQuery设置内容和属性
Apr 11 jQuery
浅谈React 服务器端渲染的使用
May 08 #Javascript
vue.js做一个简单的编辑菜谱功能
May 08 #Javascript
webstorm和.vue中es6语法报错的解决方法
May 08 #Javascript
vue2.0实现移动端的输入框实时检索更新列表功能
May 08 #Javascript
webstorm添加*.vue文件支持
May 08 #Javascript
浅谈vue项目如何打包扔向服务器
May 08 #Javascript
Javascript实现购物车功能的详细代码
May 08 #Javascript
You might like
MySQL中create table语句的基本语法是
2007/01/15 PHP
vs中通过剪切板循环来循环粘贴不同内容
2011/04/30 PHP
php url路由入门实例
2014/04/23 PHP
PHP fclose函数用法总结
2019/02/15 PHP
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
jQuery级联操作绑定事件实例
2014/09/02 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
javascript引用类型指针的工作方式
2015/04/13 Javascript
javascript动态生成树形菜单的方法
2015/11/14 Javascript
JavaScript导航脚本判断当前导航
2016/07/12 Javascript
JS瀑布流实现方法实例分析
2016/12/19 Javascript
详解Node.js串行化流程控制
2017/05/04 Javascript
js 获取json数组里面数组的长度实例
2017/10/31 Javascript
javascript+css3开发打气球小游戏完整代码
2017/11/28 Javascript
vue+vuex+axios+echarts画一个动态更新的中国地图的方法
2017/12/19 Javascript
layer插件select选中默认值的方法
2018/08/14 Javascript
nodejs搭建本地服务器并访问文件操作示例
2019/05/11 NodeJs
Vue watch响应数据实现方法解析
2020/07/10 Javascript
[04:03]辉夜杯主赛事 12月25日RECAP精彩回顾
2015/12/26 DOTA
[02:56]DOTA2上海特锦赛小组赛解说FreeAgain采访花絮
2016/02/27 DOTA
Python使用爬虫猜密码
2016/02/19 Python
特征脸(Eigenface)理论基础之PCA主成分分析法
2018/03/13 Python
python 利用turtle模块画出没有角的方格
2019/11/23 Python
AUC计算方法与Python实现代码
2020/02/28 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
2020/03/24 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
2020/06/23 Python
python开发一款翻译工具
2020/10/10 Python
五种Python转义表示法
2020/11/27 Python
学校学习雷锋活动总结
2014/07/03 职场文书
总经理助理岗位职责范本
2014/07/20 职场文书
2014年党员加强作风建设思想汇报
2014/09/15 职场文书
乡镇领导班子批评与自我批评材料
2014/09/23 职场文书
装配车间主任岗位职责
2015/04/08 职场文书
祝福语集锦:给满月宝宝的祝福语
2019/11/20 职场文书
分享Python异步爬取知乎热榜
2022/04/12 Python
让JavaScript代码更加精简的方法技巧
2022/06/01 Javascript