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 相关文章推荐
Javascript 类、命名空间、代码组织代码
Jul 31 Javascript
javascript打开word文档的方法
Apr 16 Javascript
JavaScript数组Array对象增加和删除元素方法总结
Jan 20 Javascript
js实现数组转换成json
Jun 26 Javascript
picLazyLoad 实现图片延时加载(包含背景图片)
Jul 21 Javascript
JS 实现百度搜索功能
Feb 01 Javascript
关于Webpack dev server热加载失败的解决方法
Feb 22 Javascript
Angular开发实践之服务端渲染
Mar 29 Javascript
Vue利用canvas实现移动端手写板的方法
May 03 Javascript
jquery-ui 进度条功能示例【测试可用】
Jul 25 jQuery
vue实现倒计时获取验证码效果
Apr 17 Javascript
JS实现打字游戏
Dec 17 Javascript
浅谈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
PHP 读取Postgresql中的数组
2013/04/14 PHP
关于PHP二进制流 逐bit的低位在前算法(详解)
2013/06/13 PHP
php写入数据到CSV文件的方法
2015/03/14 PHP
Javascript模块模式分析
2008/05/16 Javascript
juqery 学习之六 CSS--css、位置、宽高
2011/02/11 Javascript
jQuery中创建实例与原型继承揭秘
2011/12/21 Javascript
node.js中的fs.fstat方法使用说明
2014/12/15 Javascript
javascript原型链继承用法实例分析
2015/01/28 Javascript
js中unicode转码方法详解
2015/10/09 Javascript
JavaScript必知必会(三) String .的方法来自何方
2016/06/08 Javascript
深入理解JavaScript中的并行处理
2016/09/22 Javascript
JS实现的简单四则运算计算器功能示例
2017/09/27 Javascript
vue.js中$set与数组更新方法
2018/03/08 Javascript
三分钟学会用ES7中的Async/Await进行异步编程
2018/06/14 Javascript
JS实现的类似微信聊天效果示例
2019/01/29 Javascript
通过微信公众平台获取公众号文章的方法示例
2019/12/25 Javascript
vue学习笔记之给组件绑定原生事件操作示例
2020/02/27 Javascript
[05:29]2014DOTA2国际邀请赛 赛后专访:LGDNewbee顺利过关
2014/07/13 DOTA
python自动化测试之setUp与tearDown实例
2014/09/28 Python
Python 26进制计算实现方法
2015/05/28 Python
Python基于plotly模块实现的画图操作示例
2019/01/23 Python
通过cmd进入python的实例操作
2019/06/26 Python
浅析python 字典嵌套
2020/09/29 Python
Keras保存模型并载入模型继续训练的实现
2021/02/20 Python
荷兰最大的多品牌男装连锁店:Adam Brandstore
2019/12/31 全球购物
String这个类型的class为何定义成final?
2012/11/13 面试题
优秀学生干部个人的自我评价
2013/10/04 职场文书
校园安全教育广播稿
2014/02/17 职场文书
土建专业毕业生自荐书
2014/07/04 职场文书
2014单位领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
2014年禁毒工作总结
2014/11/24 职场文书
销售业务员岗位职责
2015/02/13 职场文书
2015小学五年级班主任工作总结
2015/05/21 职场文书
2015小学教育教学工作总结
2015/07/21 职场文书
关于python pygame游戏进行声音添加的技巧
2021/10/24 Python
PHP获取学生成绩的方法
2021/11/17 PHP