【实战】Vue全家桶(vue + axios + vue-router + vuex)搭建移动端H5项目

使用Vue全家桶开发移动端页面。
本博文默认已安装node.js。
github链接

一.准备工作

  • 安装vue
npm install vue
  • 安装脚手架vue-cli
npm install -g @vue/cli
  • 创建webpack项目
vue init webpack my-app

  • 运行
cd my-app
npm run dev


按照提示,在浏览器打开http://localhost:8082/,效果如下:

  • 安装状态管理vuex
npm install vuex --save-dev
  • 目录结构
    项目初始目录如下:

至此,准备工作已就绪,接下来将进行项目整体的结构设计。

二.项目设计

1.项目目录设计

  • assets目录下创建imagesjscss文件夹。

    • images文件夹下创建index文件夹,用于存放 首页图片(模块化,让项目结构一目了然)。
  • src目录下创建pages目录,用户存放不同的功能页面。
    • 再在pages目录下创建index首页目录。
    • index目录下创建index.vue主文件。
  • 修改router
    • 修改index.js
    import Vue from 'vue'
    import Router from 'vue-router'
    import Index from '@/pages/index'
    
    Vue.use(Router)
    
    export default new Router({
      routes: [
        {
          path: '/',
          name: 'Index',
          component: Index
        }
      ]
    })
    • 浏览器效果
  • 删除components目录下的文件,将此目录作为页面组件文件夹,在此目录下创建index文件夹,存放index首页的组件。
  • pages/index/index.vue中引入header组件
<template>
  <div class="index-wrap">
    <comHeader />
    你好,首页
  </div>
</template>

<script>
import header from '@/components/index/header'

export default {
  data() {
    return {

    }
  },
  components: {
    comHeader: header
  }
}

</script>

<style scoped>

</style>

至此,项目的整个结构被重新设计完成,接下来让我们引入rem.jsless来让我们开发起来更舒服。

2.移动端适配和less编译,让开发变得快乐起来。

  • 移动端适配 rem
    assets/js文件夹下创建common文件夹存放公共js,再在common文件夹下创建rem适配文件js。并在main.js中引入。
// rem.js
;(function (designWidth, maxWidth) {
    var doc = document,
        win = window;
    var docEl = doc.documentElement;
    var tid;
    var rootItem, rootStyle;

    function refreshRem() {
        var width = docEl.getBoundingClientRect().width;
        if (!maxWidth) {
            maxWidth = 540;
        }
        ;
        if (width > maxWidth) {
            width = maxWidth;
        }
        //与淘宝做法不同,直接采用简单的rem换算方法1rem=100px
        var rem = width * 100 / designWidth;
        //兼容UC开始
        rootStyle = "html{font-size:" + rem + 'px !important}';
        rootItem = document.getElementById('rootsize') || document.createElement("style");
        if (!document.getElementById('rootsize')) {
            document.getElementsByTagName("head")[0].appendChild(rootItem);
            rootItem.id = 'rootsize';
        }
        if (rootItem.styleSheet) {
            rootItem.styleSheet.disabled || (rootItem.styleSheet.cssText = rootStyle)
        } else {
            try {
                rootItem.innerHTML = rootStyle
            } catch (f) {
                rootItem.innerText = rootStyle
            }
        }
        //兼容UC结束
        docEl.style.fontSize = rem + "px";
    };
    refreshRem();

    win.addEventListener("resize", function () {
        clearTimeout(tid); //防止执行两次
        tid = setTimeout(refreshRem, 300);
    }, false);

    win.addEventListener("pageshow", function (e) {
        if (e.persisted) { // 浏览器后退的时候重新计算
            clearTimeout(tid);
            tid = setTimeout(refreshRem, 300);
        }
    }, false);
    if (doc.readyState === "complete") {

        doc.body.style.fontSize = "16px";
    } else {
        doc.addEventListener("DOMContentLoaded", function (e) {
            doc.body.style.fontSize = "16px";
        }, false);
    }
})(360, 750); // 360为设计图的尺寸,请按照实际设计图修改

// main.js
import Vue from 'vue'
import App from './App'
import router from './router'
import '@/assets/js/common/rem.js' // 引入rem.js

Vue.config.productionTip = false

new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

至此,rem适配已完成,在写style时便可直接按照 (设计图尺寸 / 100) rem,例如设计图给到元素height为200px,那么用rem则为height: 2rem;

  • less 编译,在写style时,为了高效开发,我们选用less编译。
// 安装less和依赖
npm install less less-loader style-loader --save-dev

以header.vue为例

<template>
  <div class="header-wrap">
    我是头头头
    <div class="title">
      title
    </div>
  </div>
</template>

<script>

</script>

<style scoped lang="less">
.header-wrap{
  height: 1rem;
  background-color: #252627;
  .title{
    color: #fff;
    height: .5rem;
  }
}
</style>

至此就可以开始页面的开发了。

3.状态管理store

  • 安装 vuex
npm install vuex --save
  • 创建store目录结构,至于store原理望大家自已学习掌握。

    • index.js
    /**
     * 组装模块并导出 store
     */
    
    import Vue from 'vue'
    import Vuex from 'vuex'
    import game from './modules/game'
    import * as actions from './actions'
    import mutations from './mutations'
    import getters from './getters'
    
    Vue.use(Vuex)
    
    const debug = process.env.NODE_ENV !== 'production'
    
    const state = {
      userInfo:{}
    }
    
    export default new Vuex.Store({
      state: state,
      actions: actions,
      mutations: mutations,
      getters:getters,
      modules: {
        game,
      },
      strict: debug
    })
    
  • 使用store
this.$store.dispatch('getData', response.data.data)

4.数据请求 axios

  • src目录下穿件utils目录用于存放工具js。在utils下创建request.jsaxios请求进行封装。
import axios from 'axios'
import { Message, MessageBox } from 'element-ui'
import config from '../../config/config'
import toast from './toast'

import store from '@/store'

const service = axios.create({
  baseURL: 'www.baidu.com',
  timeout:0// request timeout
})
service.interceptors.request.use(
    requestConfig => {
      let data = {
        // 公共请求参数
      };
      requestConfig.data = Object.assign({}, requestConfig.data, data)
      return requestConfig
    },
    error => {
      Promise.reject(error)
    }
)
// response interceptor
service.interceptors.response.use(response => {
  const res = response.data
  if (res.errno === 501) {
      MessageBox.alert('系统未登录,请重新登录', '错误', {
          confirmButtonText: '确定',
          type: 'error'
      }).then(() => {
      })
      return Promise.reject('error')
  } else if (res.errno === 502) {
      toast.showToast('系统内部错误,请联系管理员维护',1200,'error')
      return Promise.reject('error')
  } else if (res.errno === 503) {
      toast.showToast('请求业务目前未支持',1200,'error')
      return Promise.reject('error')
  } else if (res.errno === 504) {
      toast.showToast('更新数据已经失效,请刷新页面重新操作',1200,'error')
      return Promise.reject('error')
  } else if (res.errno === 505) {
      toast.showToast('更新失败,请再尝试一次',1200,'error')
      return Promise.reject('error')
  } else if (res.errno === 506) {
      toast.showToast('没有操作权限,请联系管理员授权',1200,'error')
      return Promise.reject('error')
  }  else {
      return response
    }
  }, error => {
    toast.showToast('登录连接超时',5 * 1000,'error')
    return Promise.reject(error)
  })
export default service
  • src 目录下常见 api 文件夹,并创建组件index.js
import request from '../utils/request'

/**
 * @method getUserInfo 获取用户信息
 * @param query {Object}
 */
export function getUserInfo(query){
  return request({
    url: 'user/info',
    method: 'post',
    data: query
  })
}
  • index.vue中调用
<template>
  <div class="index-wrap">
    <comHeader />
    你好,首页
  </div>
</template>

<script>
import header from '@/components/index/header'
import { getUserInfo } from '@/api/index.js'  // 引入

export default {
  data() {
    return {

    }
  },
  components: {
    comHeader: header
  },
  methods: {
    getInfo(){
      getUserInfo()  //业务逻辑
      .then(res => {
        // do something
      })
      .catch(response => {})
    }
  },
  created() {
    this.getInfo(); //调用
  }
}

</script>

<style scoped lang="less">

</style>

三.编译发布

1.编译生成 dist

npm run build

//在根目录下生成dis文件夹,可以将此文件夹放到oss上以供不同浏览器浏览。

总结

  • 在开发项目的过程中要考虑项目的模块化。
  • 尽可能的做到代码规范,具体的代码规范可在我的其他博文参考下:
  • 实际项目中的具体问题可私信我,共同解决共同学习。为你能看完本博文而感到愉悦

原文地址:https://www.cnblogs.com/huiwenhua/p/10984352.html

时间: 2024-10-15 22:14:02

【实战】Vue全家桶(vue + axios + vue-router + vuex)搭建移动端H5项目的相关文章

Vue 全家桶,深入Vue 的世界

内容简介: Vue 实例上的属性 Vue 生命周期 Vue 数据绑定 computed 计算属性 watch 监听器 Vue 组件 Vue 组件 extend Vue 组件高级属性 Vue 的render Vue-router Vux Vue 实例上的属性 组件树 $parent :用来访问组件实例的父实例 $root : 用来访问当前组件树的根实例 $children :用来访问当前组件实例的直接子组件实例 $refs :用来访问ref指令的子组件 DOM访问 $el :用来挂载当前组件实例的

项目- Vue全家桶实战去哪网App

最近在学习Vue,花了几天时间跟着做了这个项目,算是对学习Vue入门的一个总结,欢迎同学们star 去哪网APP ?? 项目演示地址:http://118.25.39.84 基于 Vue 全家桶 (2.x) 制作的 去哪网APP项目,项目完整.功能完备.UI美观.交互一流. 点击查看效果 技术栈 [前端] Vue:构建用户界面的 MVVM 框架,核心是响应的数据绑定和组系统件 vue-router:为单页面应用提供的路由系统,项目上线前使用了路由懒加载技术,来异步加载路由优化性能 vuex:Vu

Vue全家桶实战 从零独立开发企业级电商系统

Vue全家桶实战 从零独立开发企业级电商系统(免费升级Vue3.0)现阶段,电商系统随处可见,具有很大市场潜力:同时因为商城系统复杂,涉及到丰富的知识点,如果能进行电商系统的开发,其它各类型的前端系统也能掌握.本课程以Vue全家桶作为主要的技术体系,模拟小米商城,带大家从0开始开发网页和交互功能.你能进行完整的项目架构.体会页面开发的全流程.学习丰富的技术栈和各类组件知识,还能了解Git.动画.开发调试等方面的知识.同时项目本身具有很强的实用性,稍作修改,便能"为我所用".相信此课程能

前端工程师晋升课程 Vue全家桶+SSR+Koa2全栈开发美团网

第1章 课程导学这门课主讲以Vue SSR+Koa2全栈技术为目标,最终实现美团网项目.本章节旨在告诉大家我们会用到哪些技能.教学方法.课程内容分布.学习方法等.备注:我们会涉及Vue2.5.Nuxt.Koa2.element-ui.Mongodb等 1-1 课程导学第2章 Vue基础知识整个SSR部分都是用的Vue框架,需要给初级用户讲解Vue的基础语法,不会让他们在学习实战的时候感到迷茫,这个章节会通过vue-cli搭建一个简单的demo,让大家快速的掌握Vue的基础应用,即使他没有学习过.

vue全家桶和react全家桶

vue全家桶:vue  +  vuex (状态管理)  + vue-router (路由) + vue-resource +axios +elementui react全家桶 : react + redux(状态管理) +react-router(路由) + axios + antd || antd-model 原文地址:https://www.cnblogs.com/aibabel/p/11827851.html

Vue全家桶高仿小米商城

大家好,我是河畔一角,时隔半年再次给大家带来一门重量级的实战课程:<Vue全家桶高仿小米商城>,现在很多公司都在参与到商城的构建体系当中,因此掌握一套商城的标准开发体系非常重要:商城的开始时非常复杂的,包括众多的页面设计和交互,以及非常丰富的知识点,所以一旦学会商城开发,其它系统完全不在话下. 下面给大家介绍一下小米商城包含的知识点和内容: 商城的页面流程: 商城组件部分: NavHeader(导航头组件).NavFooter(导航底部组件).ServiceBar(服务条组件).Product

从零开始系列之vue全家桶(3)安装使用vuex

什么是vuex? vuex:Vue提供的状态管理工具,用于同一管理我们项目中各种数据的交互和重用,存储我们需要用到数据对象. 即data中属性同时有一个或几个组件同时使用,就是data中共用的属性. 中大型单页应用必备. 小型单页应用完全可以不用. 安装: 1.cd 项目  (如cd my-vue)后,输入 cnpm install vuex --save 2.在src下新建一个名叫store的文件夹,与App.vue同级,并在文件夹下新建store.js文件.因为store.js是基于vue的

vue全家桶(Vue+Vue-router+Vuex+axios)(Vue+webpack项目实战系列之二)

Vue有多优秀搭配全家桶做项目有多好之类的咱就不谈了,直奔主题. 一.Vue 系列一已经用vue-cli搭建了Vue项目,此处就不赘述了. 二.Vue-router Vue的路由,先献上文档(https://router.vuejs.org/zh-cn/). 路由在全家桶里面定位是什么呢,创建单页应用!简单!我们知道Vuejs是一系列的组件组成应用,既然是组件那么就需要组合起来,将组件(components)映射到路由(routes),然后告诉 vue-router 在哪里渲染它们! 我们一般在

已配置好的vue全家桶项目router,vuex,api,axios,vue-ls,async

github 地址: https://github.com/liangfengbo/vue-cli-project 点击进入 vue-cli-project 已构建配置好的vuejs全家桶项目,统一管理后端接口 | 获取数据 | 请求数据,已包含vue-router,vuex,api,axios. webpack, 储存用vue-ls, 异步async/await, css less. 下载即使用项目开发. 喜欢或对你有帮助的话请点star??,Thanks. A Vue.js project