天问

美团mpvue框架,小程序开发

全网首发mpvue课程,小程序全栈开发

mpvue是业内最火的小程序开发方案,Vue作者微博力推, GitHub上9000星好评如潮。

01
mpvue 专为小程序打造的框架

 

微信自推出小程序以来,热度一直居高不下,各大公司开始专门开发小程序,但是小程序自定义的wxml和wxss和自己定义的语法,让被三大框架统治的前端江湖头疼不易,因为需要专门为小程序开发一套代码来维护,也徒增了学习成本。

 

虽然中间有支持vuejs语法的wepy独领风骚,但只是在代码开发风格上借鉴了Vue,也是需要我们学习wepy的语法。直到mpvue横空出世,让前端的小伙伴们可以彻底解放出来。

 

 

mpvue是什么?

 

2018年3月,美团点评团队出品的小程序开发框架:mpvue,是现在业内最火的vue开发小程序解决方案。这里引用一下官方对mpvue的介绍。

 

mpvue是一个使用 Vue.js 开发小程序的前端框架。框架基于 Vue.js 核心,mpvue 修改了 Vue.js 的 runtime 和 compiler 实现,使其可以运行在小程序环境中,从而为小程序开发引入了整套 Vue.js 开发体验

以上介绍,完全是对前端的朋友们的一个大福利。既解决了小程序开发规范对较高复杂的开发方式的限制,如如组件和模块化、自动构建和集成、代码复用和开发效率等,还让开发者通过使用熟悉的 Vue.js 来开发微信小程序,降低学习新语法的成本。

而且mpvue在GitHub上获得9000星好评如潮,也得到了vuejs作者的微博力推,搞不好以后会变为vuejs的标准。

 


全网首发mpvue课程,小程序全栈开发

提供一份对原生小程序、mpvue、wepy 这三个开发框架的的横向比较,大家可自行对比下↓

 

全网首发mpvue课程,小程序全栈开发

 

图: 框架使用特点对比

 

 

02
带你动手体验mpvue的强大

 

 

学习最好的方式就动手,我们就徒手撸一个demo项目出来跑一跑

 

安装环境

 

  1. 需要大家执行 npm install vue-cli -g安装vue-cli和小程序的开发者工具

  2. 执行 vue init mpvue/mpvue-quickstart mpvue-demo 然后一路回车下去,你就得到了一个mpvue项目脚手架

  3. 进入mpvue-demo目录,执行 npm install && npm run dev启动项目 然后打开微信开发者工具,打开mpvue-demo目录,就进入了mpvue的世界 先看下mpvue的src目录,也就是源码目录结构

    全网首发mpvue课程,小程序全栈开发

基本看不出这是一个小程序项目,我们打开 /pages/counter/index.vue

  1. <template>
  2.  <div class="counter-warp">
  3.  <p>Vuex counter:{{ count }}</p>
  4.  <p>
  5.  <button @click="increment">+</button>
  6.  <button @click="decrement">-</button>
  7.  </p>
  8.  <a href="/pages/index/main" class="home">去往首页</a>
  9.  </div>
  10. </template>
  11. <script>
  12. // Use Vuex
  13. import store from './store'
  14. export default {
  15.  computed: {
  16.  count () {
  17.  return store.state.count
  18.  }
  19.  },
  20.  methods: {
  21.  increment () {
  22.  store.commit('increment')
  23.  },
  24.  decrement () {
  25.  store.commit('decrement')
  26.  }
  27.  }
  28. }
  29. </script>
  30. <style>
  31. .counter-warp {
  32.  text-align: center;
  33.  margin-top: 100px;
  34. }
  35. .home {
  36.  display: inline-block;
  37.  margin: 100px auto;
  38.  padding: 5px 10px;
  39.  color: blue;
  40.  border: 1px solid blue;
  41. }
  42. </style>

 

可以看出来这完全就是一个vuejs的组件,没有小程序的任何语法,我们现在把所有内容删掉,来尝试用vuejs做一个todolist

  1. <template>
  2.  <div class="mpvue-demo">
  3.  <p class="title">{{title}}</p>
  4.  </div>
  5. </template>
  6. <script>
  7. export default {
  8.  data () {
  9.  return {
  10.  title: 'Hello Mpvue'
  11.  }
  12.  }
  13. }
  14. </script>
  15. <style>
  16. .title{
  17.  color:#ed12a3;
  18.  text-align: center;
  19. }
  20. </style>

 

修改完毕后,打开 src/main.js修改一下pages的配置,改为 pages: ['^pages/counter/main'], 这样counter页面就变成了首页, 这时候小程序的开发者工具应该就能显示出一行 hello mpvue的字样,如果没变化,可以看下命令行,可能是代码规范不符合

全网首发mpvue课程,小程序全栈开发

我们写的,都是单纯的html+css+vue的语法,但是已经能够在小程序里继续运行了,然后我们来继续,尝试渲染一个列表

  1. <template>
  2.  <div class="mpvue-demo">
  3.  <p class="title">{{title}}</p>
  4.  <ul class="todos">
  5.  <li v-key='i' v-for='(todo,i) in todos'>{{todo}}</li>
  6.  </ul>
  7.  </div>
  8. </template>
  9. <script>
  10. export default {
  11.  data () {
  12.  return {
  13.  title: 'Hello Mpvue',
  14.  todos: ['吃饭''睡觉''慕课学习']
  15.  }
  16.  }
  17. }
  18. </script>
  19. <style>
  20. .title{
  21.  color:#ed12a3;
  22.  text-align: center;
  23. }
  24. ul.todos{
  25.  margin:20px;
  26. }
  27. </style>

我们新增了ul和li,并且使用v-for渲染列表,下面我们尝试加上用户输入,能够添加一条记录 ,需要用到input和button标签,以及vuejs的事件处理@click

  1. <template>
  2.  <div class="mpvue-demo">
  3.  <p class="title">{{title}}</p>
  4.  <input type="text" v-model='mytodo'>
  5.  <button @click='addTodo'>添加一条</button>
  6.  <ul class="todos">
  7.  <li v-key='i' v-for='(todo,i) in todos'>{{todo}}</li>
  8.  </ul>
  9.  </div>
  10. </template>
  11. <script>
  12. export default {
  13.  data () {
  14.  return {
  15.  mytodo: '',
  16.  title: 'Hello Mpvue',
  17.  todos: ['吃饭''睡觉''慕课学习']
  18.  }
  19.  },
  20.  methods: {
  21.  addTodo () {
  22.  if (!this.mytodo) {
  23.  return
  24.  }
  25.  this.todos.push(this.mytodo)
  26.  this.mytodo = ''
  27.  }
  28.  }
  29. }
  30. </script>
  31. <style>
  32. .title{
  33.  color:#ed12a3;
  34.  text-align: center;
  35. }
  36. ul.todos{
  37.  margin:20px;
  38. }
  39. input{
  40.  border:2px solid #ed12a3;
  41. }
  42. </style>
全网首发mpvue课程,小程序全栈开发

然后我们再添加一个功能来尝试一下计算属性以及样式渲染,没个事件都添加一个点击时间,可以标记为完成,并且显示删除的样式,我们需要对todos的数据结构进行扩展,加入done字段

  1. <template>
  2.  <div class="mpvue-demo">
  3.  <p class="title">{{title}}</p>
  4.  <input type="text" v-model='mytodo'>
  5.  <button @click='addTodo'>添加一条</button>
  6.  <ul class="todos">
  7.  <li
  8.  v-for='(todo,i) in todos'
  9.  v-key='i'
  10.  :class="{'done':todo.done}"
  11.  @click='toggle(i)'
  12.  >{{todo.text}}</li>
  13.  </ul>
  14.  </div>
  15. </template>
  16. <script>
  17. export default {
  18.  data () {
  19.  return {
  20.  mytodo: '',
  21.  title: 'Hello Mpvue',
  22.  todos: [
  23.  {text: '吃饭', done: false},
  24.  {text: '睡觉', done: false},
  25.  {text: '慕课学习', done: false}
  26.  ]
  27.  }
  28.  },
  29.  methods: {
  30.  addTodo () {
  31.  if (!this.mytodo) {
  32.  return
  33.  }
  34.  this.todos.push(this.mytodo)
  35.  this.mytodo = ''
  36.  },
  37.  toggle (i) {
  38.  this.todos[i].done = !this.todos[i].done
  39.  }
  40.  }
  41. }
  42. </script>
  43. <style>
  44. .title{
  45.  color:#ed12a3;
  46.  text-align: center;
  47. }
  48. ul.todos{
  49.  margin:20px;
  50. }
  51. input{
  52.  border:2px solid #ed12a3;
  53. }
  54. .done{
  55.  text-decoration: line-through;
  56. }
  57. </style>

 

全网首发mpvue课程,小程序全栈开发

我们还需要显示已经完成的进度,以及清空按钮,这里就需要vuejs的计算属性

  1. <template>
  2.  <div class="mpvue-demo">
  3.  <p class="title">{{title}}</p>
  4.  <input type="text" v-model='mytodo'>
  5.  <button @click='addTodo'>添加一条</button>
  6.  <button @click='clearTodo'>清空</button>
  7.  <ul class="todos">
  8.  <li
  9.  v-for='(todo,i) in todos'
  10.  v-key='i'
  11.  :class="{'done':todo.done}"
  12.  @click='toggle(i)'
  13.  >{{todo.text}}</li>
  14.  <li>
  15.  {{todoNum}}/{{todos.length}}
  16.  </li>
  17.  </ul>
  18.  </div>
  19. </template>
  20. <script>
  21. export default {
  22.  data () {
  23.  return {
  24.  mytodo: '',
  25.  title: 'Hello Mpvue',
  26.  todos: [
  27.  {text: '吃饭', done: false},
  28.  {text: '睡觉', done: false},
  29.  {text: '慕课学习', done: false}
  30.  ]
  31.  }
  32.  },
  33.  computed: {
  34.  todoNum () {
  35.  return this.todos.filter(v => !v.done).length
  36.  }
  37.  },
  38.  methods: {
  39.  clearTodo () {
  40.  this.todos = this.todos.filter(v => !v.done)
  41.  },
  42.  addTodo () {
  43.  if (!this.mytodo) {
  44.  return
  45.  }
  46.  this.todos.push({text: this.mytodo, done: false})
  47.  this.mytodo = ''
  48.  },
  49.  toggle (i) {
  50.  this.todos[i].done = !this.todos[i].done
  51.  }
  52.  }
  53. }
  54. </script>
  55. <style>
  56. .title{
  57.  color:#ed12a3;
  58.  text-align: center;
  59. }
  60. ul.todos{
  61.  margin:20px;
  62. }
  63. input{
  64.  border:2px solid #ed12a3;
  65. }
  66. .done{
  67.  text-decoration: line-through;
  68. }
  69. </style>
全网首发mpvue课程,小程序全栈开发

最后 我们在加入本地存储,每次变动的时候都存在localStorage里,并且再初始化的 created生命周期函数里,从localStorage获取列表初始化todos即可

 

全网首发mpvue课程,小程序全栈开发

注意中间有一次刷新的操作,下次进来 依然能保存之前的状态,全部代码如下

  1. <template>
  2.  <div class="mpvue-demo">
  3.  <p class="title">{{title}}</p>
  4.  <input type="text" v-model='mytodo'>
  5.  <button @click='addTodo'>添加一条</button>
  6.  <button @click='clearTodo'>清空</button>
  7.  <ul class="todos">
  8.  <li
  9.  v-for='(todo,i) in todos'
  10.  v-key='i'
  11.  :class="{'done':todo.done}"
  12.  @click='toggle(i)'
  13.  >{{todo.text}}</li>
  14.  <li>
  15.  {{todoNum}}/{{todos.length}}
  16.  </li>
  17.  </ul>
  18.  </div>
  19. </template>
  20. <script>
  21. export default {
  22.  // 数据
  23.  data () {
  24.  return {
  25.  mytodo: '',
  26.  title: 'Hello Mpvue',
  27.  todos: [
  28.  ]
  29.  }
  30.  },
  31.  // 计算属性
  32.  computed: {
  33.  todoNum () {
  34.  return this.todos.filter(v => !v.done).length
  35.  }
  36.  },
  37.  // created生命周期,组件创建后执行
  38.  created () {
  39.  // 从本地存储里获取数据
  40.  this.todos = wx.getStorageSync('todos') || []
  41.  },
  42.  methods: {
  43.  // 清空已完成的事情
  44.  clearTodo () {
  45.  this.todos = this.todos.filter(v => !v.done)
  46.  this.updateStorage()
  47.  },
  48.  // 更新本地存储
  49.  updateStorage () {
  50.  wx.setStorageSync('todos'this.todos)
  51.  },
  52.  // 添加事件
  53.  addTodo () {
  54.  if (!this.mytodo) {
  55.  return
  56.  }
  57.  this.todos.push({text: this.mytodo, done: false})
  58.  this.mytodo = ''
  59.  this.updateStorage()
  60.  },
  61.  // 设置事件状态
  62.  toggle (i) {
  63.  this.todos[i].done = !this.todos[i].done
  64.  this.updateStorage()
  65.  }
  66.  }
  67. }
  68. </script>
  69. <style>
  70. .title{
  71.  color:#ed12a3;
  72.  text-align: center;
  73. }
  74. ul.todos{
  75.  margin:20px;
  76. }
  77. input{
  78.  border:2px solid #ed12a3;
  79. }
  80. .done{
  81.  text-decoration: line-through;
  82. }
  83. </style>
博客地址:http://blog.yoqi.me/?p=13146
扫我捐助哦
喜欢 0

这篇文章还没有评论

发表评论