• Vue搭建移动端h5项目(已开源,附带git地址)Vant+Vue Router+Vuex+axios封装+案例交互+部分代码说明


    一、项目介绍以及项目地址        

            项目介绍:vue2搭建。项目通过amfe-flexible与postcss-pxtorem实现移动端适配;通过Vant ui作为项目的组件库;通过Vuex管理数据状态,进行模块化管理;通过Vue Router配置项目路由,进行模块化管理;封装axios进行数据的请求,以及一些页面逻辑的交互和简单的代码说明。

            项目地址:h5-vant

            联系博主:如有问题可联系博主=》QQ:1596892941  VX:weiyi1596892941

            项目说明:如果项目需要直接拿去用,如果想研究一下就向下观看。如果有其他想法请留言或者联系我(期待大家提出的需求以及优化意见)。

    二、通过amfe-flexible与postcss-pxtorem实现移动端适配

     通过amfe-flexible与postcss-pxtorem实现移动端适配

    1.介绍amfe-flexible
    amfe-flexible是配置可伸缩布局方案,主要是将1rem设为viewWidth/10。
    2.介绍postcss-pxtorem
    postcss-pxtorem是postcss的插件,用于将像素(px)单元生成rem单位。

    安装

    yarn add amfe-flexible 

    yarn add postcss-pxtorem

    引入(main.js中)

    /* 引入移动端适配 */

    import 'amfe-flexible';

    新建postcss.config.js文件

    1. module.exports = {
    2. publicPath: './',
    3. assetsDir: './',
    4. lintOnSave: false, //关闭eslint语法检测
    5. css: {
    6. loaderOptions: {
    7. postcss: {
    8. plugins: [
    9. require('postcss-pxtorem')({
    10. rootValue: 37.5,
    11. propList: ['*']
    12. })
    13. ]
    14. }
    15. }
    16. },
    17. }

    三、引入vant组件库

    采用的是全局引入的方式

    安装依赖

    yarn add vant@latest-v2 -S

    导入全部组价

    1. import Vue from 'vue';
    2. import Vant from 'vant';
    3. import 'vant/lib/index.css';
    4. Vue.use(Vant);

    四、Vuex模块化状态管理

    子模块代码

    1. const state = {
    2. name: '勇敢小陈'
    3. }
    4. const getters = {
    5. }
    6. const actions = {
    7. }
    8. const mutations = {
    9. operation(state, value) {
    10. state.name += value
    11. }
    12. }
    13. const store_modular = {
    14. namespaced: true,//开启命名空间,命名空间是为了解决方法可能出现命名重复的问题
    15. state,
    16. getters,
    17. actions,
    18. mutations
    19. }
    20. export default store_modular

    主模块引入子模块

    1. import Vue from 'vue'
    2. import Vuex from 'vuex'
    3. import store_modular from '@/store/store_modular/index.js'
    4. Vue.use(Vuex)
    5. export default new Vuex.Store({
    6. state: {
    7. },
    8. getters: {
    9. },
    10. mutations: {
    11. },
    12. actions: {
    13. },
    14. modules: {
    15. store_modular
    16. }
    17. })

    五、Vue Router模块化管理路由

    子模块代码

    1. const router_modular = [
    2. {
    3. path: '/',
    4. name: 'home',
    5. component: () => import('@/views/HomeView')
    6. },
    7. {
    8. path: '/about',
    9. name: 'about',
    10. // route level code-splitting
    11. // this generates a separate chunk (about.[hash].js) for this route
    12. // which is lazy-loaded when the route is visited.
    13. component: () => import(/* webpackChunkName: "about" */ '@/views/AboutView.vue')
    14. }
    15. ]
    16. export default router_modular

    主模块代码(配置全局路由守卫)

    1. import Vue from 'vue'
    2. import VueRouter from 'vue-router'
    3. import router_modular from '@/router/router_modular/index.js'
    4. Vue.use(VueRouter)
    5. const routes = [
    6. ...router_modular
    7. ]
    8. const router = new VueRouter({
    9. routes
    10. })
    11. //全局路由守卫
    12. router.beforeEach((to,from,next)=>{
    13. console.log(to,from);
    14. next()
    15. })
    16. router.afterEach((to,from)=>{
    17. console.log(to,from);
    18. })
    19. export default router

    六、axios请求的封装

    新建request.js文件用于axios的简单封装

    1. /**** request.js ****/
    2. // 导入axios
    3. import axios from 'axios'
    4. import config from '@/config/index';
    5. const baseUrl =
    6. process.env.NODE_ENV === 'development'
    7. ? config.baseUrl.dev
    8. : config.baseUrl.pro;
    9. //1. 创建新的axios实例,
    10. const service = axios.create({
    11. // 公共接口--这里注意后面会讲
    12. baseURL:baseUrl,
    13. // 超时时间 单位是ms,这里设置了3s的超时时间
    14. timeout: 3 * 1000
    15. })
    16. // 2.请求拦截器
    17. service.interceptors.request.use(config => {
    18. //发请求前做的一些处理,数据转化,配置请求头,设置token,设置loading等,根据需求去添加
    19. config.data = JSON.stringify(config.data); //数据转化,也可以使用qs转换
    20. config.headers = {
    21. 'Content-Type':'application/json' //配置请求头
    22. }
    23. //如有需要:注意使用token的时候需要引入cookie方法或者用本地localStorage等方法,推荐js-cookie
    24. //const token = getCookie('名称');//这里取token之前,你肯定需要先拿到token,存一下
    25. // if(token){
    26. // config.params = {'token':token} //如果要求携带在参数中
    27. // config.headers.token= token; //如果要求携带在请求头中
    28. // }
    29. return config
    30. }, error => {
    31. Promise.reject(error)
    32. })
    33. // 3.响应拦截器
    34. service.interceptors.response.use(response => {
    35. //接收到响应数据并成功后的一些共有的处理,关闭loading等
    36. return response
    37. }, error => {
    38. /***** 接收到异常响应的处理开始 *****/
    39. return Promise.resolve(error.response)
    40. })
    41. //4.导入文件
    42. export default service

    新建http.js进行请求方式的简单封装

    1. /**** http.js ****/
    2. // 导入封装好的axios实例
    3. import request from './request'
    4. const http ={
    5. /**
    6. * methods: 请求
    7. * @param url 请求地址
    8. * @param params 请求参数
    9. */
    10. get(url,params){
    11. const config = {
    12. method: 'get',
    13. url:url
    14. }
    15. if(params) config.params = params
    16. return request(config)
    17. },
    18. post(url,params){
    19. const config = {
    20. method: 'post',
    21. url:url
    22. }
    23. if(params) config.data = params
    24. return request(config)
    25. },
    26. put(url,params){
    27. const config = {
    28. method: 'put',
    29. url:url
    30. }
    31. if(params) config.params = params
    32. return request(config)
    33. },
    34. delete(url,params){
    35. const config = {
    36. method: 'delete',
    37. url:url
    38. }
    39. if(params) config.params = params
    40. return request(config)
    41. }
    42. }
    43. //导出
    44. export default http

    新建api文件进行请求路径的模块化处理

    1. import http from '../utils/http'
    2. //
    3. /**
    4. * @parms resquest 请求地址 例如:http://197.82.15.15:8088/request/...
    5. * @param '/testIp'代表vue-cil中config,index.js中配置的代理
    6. */
    7. // get请求
    8. const testApi = {
    9. getListAPI(params) {
    10. return http.get('/api/joke/list', params)
    11. },
    12. postFormAPI(params) {
    13. return http.post('/api/user/reg', params)
    14. }
    15. }
    16. export default testApi

    七、简单的案例展示

    包含:vuex、vant、axios以及页面的交互业务处理

    1. <template>
    2. <div class="content">
    3. <div>{{ name }}</div>
    4. <div>
    5. <van-button type="primary" @click="operation('点赞关注')"
    6. >点我更改信息</van-button
    7. >
    8. </div>
    9. <div>
    10. <van-field v-model="num" label="数量" /><van-button
    11. type="primary"
    12. @click="getList"
    13. >发送请求获取笑话</van-button
    14. >
    15. </div>
    16. <div style="width: 100%">
    17. <van-list>
    18. <van-cell v-for="item in list" :key="item" :title="item" />
    19. </van-list>
    20. </div>
    21. <van-button loading type="info" loading-text="加载中..." />
    22. </div>
    23. </template>
    24. <script>
    25. import { mapState, mapMutations } from "vuex";
    26. import testApi from "@/api/test";
    27. export default {
    28. computed: {
    29. ...mapState("store_modular", ["name"]),
    30. },
    31. data() {
    32. return {
    33. num: 0,
    34. list: [],
    35. };
    36. },
    37. methods: {
    38. ...mapMutations("store_modular", ["operation"]),
    39. getList() {
    40. if(this.num==0){
    41. this.$toast.fail("数量不能为0");
    42. return
    43. }
    44. this.$toast.loading({
    45. message: '加载中...',
    46. forbidClick: true,
    47. duration:0
    48. });
    49. testApi
    50. .getListAPI({ num: this.num })
    51. .then((res) => (this.list = res.data.data))
    52. .catch((err) => console.log(err))
    53. .finally(()=>{this.$toast.clear()});
    54. },
    55. },
    56. };
    57. </script>
    58. <style>
    59. </style>

  • 相关阅读:
    Harmony SDK API 版本 与 Harmony OS 版本对照表,及如何查看鸿蒙手机Harmony SDK Api 版本
    【自动化测试框架】关于unitttest你需要知道的事
    Elasticsearch的介绍与安装
    前端埋点-分析用户在线时间
    Python leetcode468:验证ip地址,解法
    【Linux】进程数据结构
    eclipse导入jdbc教程(简洁)
    深度学习框架大战:究竟选择TensorFlow还是PyTorch?
    Mooctest
    Hadoop的HDFS的集群安装部署
  • 原文地址:https://blog.csdn.net/ct5211314/article/details/125497899