使用mpvue开发小程序教程(三)

作者: 一斤代码 | 来源:发表于2018-07-21 12:11 被阅读676次

    在上一篇文章中,我们熟悉了一下通过vue-cli生成的mpvue工程代码骨架的基本结构,大致了解了每一个部分的代码到底要放到何处。从本文起我们就开始涉及真正的编码部分,学习使用Vue的语法去编写小程序。

    为了清楚起见,我们将要对vue-cli生成的代码做一个清理工作,具体如下:

    • 删掉src/componentssrc/pagessrc/utils三个目录下的所有代码文件

    • src/App.vue文件中的内容重置成:

    <script>
    export default {}
    </script>
    
    <style>
    </style>
    
    • src/main.js文件中的内容重置成:
    import Vue from 'vue'
    import App from './App'
    
    Vue.config.productionTip = false
    App.mpType = 'app'
    
    const app = new Vue(App)
    app.$mount()
    
    export default {
      config: {
        pages: [],
        window: {
          backgroundTextStyle: 'light',
          navigationBarBackgroundColor: '#fff',
          navigationBarTitleText: '第一个小程序',
          navigationBarTextStyle: 'black'
        }
      }
    }
    

    至此,我们的代码就成了一个小程序页面都没有的初始状态。

    程序入口

    学习过使用小程序原生框架开发的朋友都知道,一个小程序的入口应该包含这三个最重要的部分:
    1)app.json
    2)app.js
    3)首页

    有了这三个部分,才能成功运行起一个最简单的小程序。

    app.json

    app.json是小程序的全局配置文件,其包含了小程序的页面文件路径配置、窗口的全局样式信息、底部选项卡式菜单栏的配置,以及一些小程序网络超时的配置等等。app.json的配置详情我们可以查阅参考小程序的官方文档来作进一步了解。那么,在mpvue中我们如何来做与之等价的配置呢?

    其实在src/main.js中,我们就可以完整的进行这些信息的配置,具体可以查看该文件的最底部代码:

    export default {
      // 这部分相当于原生小程序的 app.json
      config: {
        pages: [],
        window: {
          backgroundTextStyle: 'light',
          navigationBarBackgroundColor: '#fff',
          navigationBarTitleText: '第一个小程序',
          navigationBarTextStyle: 'black'
        }
      }
    }
    

    在该代码中通过export default导出的对象的config属性下的值,就是这些小程序的配置信息了。

    app.js

    app.js中包含了小程序的各种原生生命周期方法,如onLaunchonShow等等。而在mpvue中,它使用了一个简单的Vue组件App.vue来实现等价的功能。我们在这个App.vue组件中可以编写小程序的生命周期方法(通常使用Vue的生命周期方法,但也兼容原生的生命周期方法),也可以在其中加入小程序的全局样式(等价于原生方式下的app.wxss):

    <script>
    /* 这部分相当于原生小程序的 app.js */
    export default {
      created () {
        console.log('miniapp created!!!')
      }
    }
    </script>
    
    <style>
    /* 这部分相当于原生小程序的 app.wxss */
    .container {
      background-color: #cccccc;
    }
    </style>
    

    接着,这个App.vue组件被src/main.js引入并被设置了一个mpType的属性值,其值为app。这个值是为了与后面要讲的小程序页面组件所区分开来,因为小程序页面组件和这个App.vue组件的写法和引入方式是一致的,为了区分两者,需要设置mpType值。引入这个App.vue组件后,会用它作为参数来创建一个Vue的实例,并调用$mount()方法加载。下面是这个过程的关键代码行:

    App.mpType = 'app'
    const app = new Vue(App)
    app.$mount()
    
    首页、以及其他页面

    每个小程序都需要至少有一个页面,第一个展示的页面被叫做首页。因为前面已经把所有的页面代码都删完了,所以我们现在要新建一个首页。在src/pages目录下,我们新建一个名为index的子目录(请遵循每个页面放入一个子目录的良好习惯),然后在该子目录下,新建2个文件:一个用于实现页面主体功能的index.vue组件,另一个则用于将这个页面组件生成Vue实例并加载的main.js。以后的每一个mpvue页面组件都会拥有这样的结构。

    然后在main.js中编写如下代码,非常简单的一段代码,它的功能是引入index.vue并创建Vue实例:

    import Vue from 'vue'
    import App from './index'
    
    const app = new Vue(App)
    app.$mount()
    

    接着,我们需要实现index.vue页面组件,它的写法是最典型的Vue组件写法。

    <template>
      <div class="container" @click="clickHandle">
        <div class="message">{{msg}}</div>
      </div>
    </template>
    
    <script>
    export default {
      data () {
        return {
          msg: 'Hello'
        }
      },
    
      methods: {
        clickHandle () {
          this.msg = 'Clicked!!!!!!'
        }
      }
    }
    </script>
    
    <style scoped>
    .message {
      color: red;
      padding: 10px;
      text-align: center;
    }
    </style>
    

    可以看到,这个组件完全看不到小程序写法的影子,而是全部由Vue开发Web应用的写法来完成:数据绑定、事件处理、scoped局部样式、以及使用HTML标签来构建界面。这样最大化的保持和网页应用开发一致,减少了前端人员切换到小程序的学习理解成本,也为原先使用Vue开发的网页应用移植到小程序平台提供了降低迁移成本的可能。

    模板部分我们通常可以用HTML标签来写,比如divspan等,它们会在编译的时候被自动转换成小程序的原生组件viewtext之类;而那些小程序特有的组件如swiperrich-text等,可以直接在模板中使用。

    在原生小程序的页面(Page)中包含了很多页面的生命周期方法,如onLoadonUnloadonShowonHideonPullDownRefresh等等,mpvue中推荐使用Vue组件生命周期方法,而像onPullDownRefreshonReachBottom这类特殊功能的生命周期则需直接使用原生的。

    回头再来看,当我们实现了这个index.vue页面组件后,其实还缺最后一个步骤,就是需要将这个页面组件指定为首页。如果我们的小程序只有一个页面的话,其实也可以省略这一步,因为mpvue会自动将src/pages目录下的页面组件路径添加到最终编译出来的小程序配置文件中去(可以打开dist/app.json文件观察一下):

    {
      "pages": [
        "pages/index/main"
      ],
      "window": {
        "backgroundTextStyle": "light",
        "navigationBarBackgroundColor": "#fff",
        "navigationBarTitleText": "第一个小程序",
        "navigationBarTextStyle": "black"
      }
    }
    

    但是,大多数情况下我们的小程序会由很多个页面组成,在src/pages目录下编写多个页面组件后,mpvue也会自动把它们都添加进配置文件,但是由于小程序有一个机制:

    配置文件中pages数组里的第一个page路径会被当做是首页

    如果你期望的首页组件并没有被mpvue添加到第一个路径的话,就不会被当做首页显示。比如有多个页面,并在dist/app.json里生成的是下面的序列,则第一个pages/articles/main页面会被当做首页:

    "pages": [
      "pages/articles/main",
      "pages/authors/main",
      "pages/index/main",
      "pages/kickstart/main"
    ]
    

    为了解决这种情况,我们需要显式的去指定首页。可以在src/main.js的配置里,加入这样一行配置信息:

    pages: [
      '^pages/index/main'
    ]
    

    注意:以上配置中指定为首页的路径前面有个^符号。

    加入这行配置之后,pages/index/main总是会在最终生成的dist/app.json中排在第一个位置,成为首页。

    小结

    今天主要了解了作为一个最简单的可以运行的mpvue小程序所应该包含的各个代码部分,希望你可以动手实践一下,理解和掌握这些内容。Good Luck!

    相关文章

      网友评论

      • 8cd19aa0347e:想问一下楼主 dist -> pages下的页面用删除吗 为什么我的首页修改不了?
        8cd19aa0347e:@一斤代码 有时间我试一下 谢谢楼主:pray:
        一斤代码:是修改了源代码,预览的时候还是老的么?这种情况,可以把dist目录整个删掉,然后重新运行一个npm run dev试试
      • ccf955115922:楼主 我在单独页面下的main.js 中加入了 "navigationBarTitleText": "文章列表页面" 的这一段代码 和文章中一致 重新编译没有任何效果 请问知道是怎么回事吗
        ccf955115922:@一斤代码 好的 我这边已经成功了 谢谢
        一斤代码:上面的评论中已经说明了,这是由于新版本mpvue中的改变引起的,新版本中这些配置信息需要写到main.json文件中去,原先的在main.js中的方式已经没效果了。
      • 夜Se轻染:为了解决这种情况,我们需要显式的去指定首页。可以在src/main.js的配置里,加入这样一行配置信息:

        pages: [
        '^pages/index/main'
        ]
        注意:以上配置中指定为首页的路径前面有个^符号。

        mpvue升级之后这样显式设置首页好像不行了,开发者工具直接报错:找不到此页面。
      • Peng_6114:请问这个有视频教程吗:grin:
        一斤代码:@Peng_6114 还没有
      • JyLie::blush: 楼主真用心
      • 神奇的小猴子:麻烦问一下,每个页面都会有一个main.js的配置文件吗?如果要是这样,他依然没有解决小程序带来的多文件问题啊?之前用了半年的wepy,虽然现在的坑依然很多,但是它是真正实现了单文件编写,第三方依赖,redux等等。
        一斤代码:目前看来,通过vue-cli生成的框架代码,每个页面都需要伴有main.js。
      • 石溪:注意,以下配置,写在main.js的export中不起作用。
        需要写在/src/main.json中,不知道是不是因为mpvue的工具版本升级了的缘故。
        ```
        {
        "pages": [
        "pages/index/main"
        ],
        "window": {
        "backgroundTextStyle": "light",
        "navigationBarBackgroundColor": "#fff",
        "navigationBarTitleText": "第一个小程序",
        "navigationBarTextStyle": "black"
        }
        }
        ```
        ccae4e15f9ac:1.1.1 以上

        推荐和小程序一样,将 app.json/page.json 放到页面入口处,使用 copy-webpack-plugin copy 到对应的生成位置。

        1.1.1 以下

        这部分内容来源于 app 和 page 的 entry 文件,通常习惯是 main.js,你需要在你的入口文件中 export default { config: {} },这才能被我们的 loader 识别为这是一个配置,需要写成 json 文件。
        OneZ杰:你好,麻烦问一下,我创建完工程,在/src/mian.js配置不生效,需要在/src/app.json配置,但是想设置每个页面的("navigationBarTitleText": "首页",)是没有效果的。
        一斤代码:mpvue好像最近确实更新了,之前老的代码可以,尝试生成一个最新的工程确实会有问题,还有其他的bug存在,可能要等最新版本稳定下来。
      • 勇于优秀疯子:怎么生成制定的页面,比如我想生成pages/index/index,mpvue 怎么弄
      • 沉睡的古莲:不错哦,学习了

      本文标题:使用mpvue开发小程序教程(三)

      本文链接:https://www.haomeiwen.com/subject/fsjapftx.html