vue2/3学习(8)

196 阅读2分钟

基于 VueCli 自定义创建项目

屏幕截图 2024-01-31 200456.png

调整初始化目录

屏幕截图 2024-01-31 200828.png

vant组件库的按需导入导出

第三方Vue组件库 vant-ui (vue2 vant2,vue3 vant4):

vant-contrib.gitee.io/vant/v2/#/z…

其他 Vue 组件库:

导入方式

  1. 自动按需引入组件
  2. 收到按需引入组件
  3. 导入所有组件

全部导入开发时方便,但体积大

按需导入对性能要求低

屏幕截图 2024-01-31 202033.png

全部导入

  1. 安装vant-ui
yarn add vant@latest-v2
  1. 在main.js中
import Vant from 'vant';
import 'vant/lib/index.css';
// 把vant中所有的组件都导入了
Vue.use(Vant)
  1. 使用测试
<van-button type="primary">主要按钮</van-button>
<van-button type="info">信息按钮</van-button>

按需引入

  1. 安装vant-ui
yarn add vant@latest-v2
  1. 安装一个插件
yarn add babel-plugin-import -D
  1. babel.config.js中配置
module.exports = {
  presets: [
    '@vue/cli-plugin-babel/preset'
  ],
  plugins: [
    ['import', {
      libraryName: 'vant',
      libraryDirectory: 'es',
      style: true
    }, 'vant']
  ]
}
  1. 按需加载,在main.js
import { Button, Icon } from 'vant'

Vue.use(Button)
Vue.use(Icon)
  1. app.vue中进行测试
<van-button type="primary">主要按钮</van-button>
<van-button type="info">信息按钮</van-button>
<van-button type="default">默认按钮</van-button>
<van-button type="warning">警告按钮</van-button>
<van-button type="danger">危险按钮</van-button>
  1. 把引入组件的步骤抽离到单独的js文件中比如 utils/vant-ui.js
import { Button, Icon } from 'vant'

Vue.use(Button)
Vue.use(Icon)
  1. main.js 中进行导入
// 导入按需导入的配置文件
import '@/utils/vant-ui'

vw适配

  1. 安装插件
yarn add postcss-px-to-viewport@1.1.1 -D
  1. 根目录, 新建postcss的配置文件 postcss.config.js
// postcss.config.js
module.exports = {
  plugins: {
    'postcss-px-to-viewport': {
    //view适配的标准屏宽度:iphoneX
      viewportWidth: 375,
    }
  }
}

路由设计配置

屏幕截图 2024-01-31 202630.png

router/index.js 一级路由配置

import Vue from 'vue'
import VueRouter from 'vue-router'
import Layout from '@/views/layout'
import Search from '@/views/search'
import SearchList from '@/views/search/list'
import ProDetail from '@/views/prodetail'
import Login from '@/views/login'
import Pay from '@/views/pay'
import MyOrder from '@/views/myorder'

Vue.use(VueRouter)

const router = new VueRouter({
  routes: [
    {
      path: '/login',
      component: Login
    },
    {
      path: '/',
      component: Layout
    },
    {
      path: '/search',
      component: Search
    },
    {
      path: '/searchlist',
      component: SearchList
    },
    {
      path: '/prodetail/:id',
      component: ProDetail
    },
    {
      path: '/pay',
      component: Pay
    },
    {
      path: '/myorder',
      component: MyOrder
    }
  ]
})

export default router

tabbar标签页:

  1. vant-ui.js 按需引入
import { Tabbar, TabbarItem } from 'vant'
Vue.use(Tabbar)
Vue.use(TabbarItem)
  1. layout.vue

  2. 修改文字、图标、颜色

<van-tabbar active-color="#ee0a24" inactive-color="#000">
<van-tabbar-item icon="wap-home-o">首页</...>
<van-tabbar-item icon="apps-o">分类页</...>
<van-tabbar-item icon="shopping-cart-o">购物车</...>
<van-tabbar-item icon="user-o">我的</...>
</van-tabbar>

屏幕截图 2024-01-31 203340.png

登录静态布局和图形验证码功能

屏幕截图 2024-01-31 203654.png **(1) 准备工作 **

  1. 新建 styles/common.less 重置默认样式
// 重置默认样式
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

// 文字溢出省略号
.text-ellipsis-2 {
  overflow: hidden;
  -webkit-line-clamp: 2;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-box-orient: vertical;
}
  1. main.js 中导入应用 common.less
import '@/styles/common.less'
  1. 将准备好的一些图片素材拷贝到 assets 目录【备用】

(2) 登录静态布局

  • 头部组件说明
  • 通用样式覆盖
  • 其他静态结构编写
  1. 使用组件
  • van-nav-bar

vant-ui.js 注册

import { NavBar } from 'vant'
Vue.use(NavBar)

Login.vue 使用

<template>
  <div class="login">
    <van-nav-bar title="会员登录" left-arrow @click-left="$router.go(-1)" />
    <div class="container">
      <div class="title">
        <h3>手机号登录</h3>
        <p>未注册的手机号登录后将自动注册</p>
      </div>

      <div class="form">
        <div class="form-item">
          <input class="inp" maxlength="11" placeholder="请输入手机号码" type="text">
        </div>
        <div class="form-item">
          <input class="inp" maxlength="5" placeholder="请输入图形验证码" type="text">
          <img src="@/assets/code.png" alt="">
        </div>
        <div class="form-item">
          <input class="inp" placeholder="请输入短信验证码" type="text">
          <button>获取验证码</button>
        </div>
      </div>

      <div class="login-btn">登录</div>
    </div>
  </div>
</template>

<script>
export default {
  name: 'LoginPage'
}
</script>

<style lang="less" scoped>
.container {
  padding: 49px 29px;

  .title {
    margin-bottom: 20px;
    h3 {
      font-size: 26px;
      font-weight: normal;
    }
    p {
      line-height: 40px;
      font-size: 14px;
      color: #b8b8b8;
    }
  }

  .form-item {
    border-bottom: 1px solid #f3f1f2;
    padding: 8px;
    margin-bottom: 14px;
    display: flex;
    align-items: center;
    .inp {
      display: block;
      border: none;
      outline: none;
      height: 32px;
      font-size: 14px;
      flex: 1;
    }
    img {
      width: 94px;
      height: 31px;
    }
    button {
      height: 31px;
      border: none;
      font-size: 13px;
      color: #cea26a;
      background-color: transparent;
      padding-right: 9px;
    }
  }

  .login-btn {
    width: 100%;
    height: 42px;
    margin-top: 39px;
    background: linear-gradient(90deg,#ecb53c,#ff9211);
    color: #fff;
    border-radius: 39px;
    box-shadow: 0 10px 20px 0 rgba(0,0,0,.1);
    letter-spacing: 2px;
    display: flex;
    justify-content: center;
    align-items: center;
  }
}
</style>

request模块-axios封装

屏幕截图 2024-01-31 204150.png

1. 安装 axios

npm i axios

2. 新建 utils/request.js 封装 axios 模块

利用 axios.create 创建一个自定义的 axios 来使用

www.axios-js.com/zh-cn/docs/…

/* 封装axios用于发送请求 */
import axios from 'axios'

// 创建一个新的axios实例
//好处:不会污染原始的 axios 实例
const request = axios.create({
  baseURL: 'http://cba.itlike.com/public/index.php?s=/api/',
  timeout: 5000
})

// 添加请求拦截器
request.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
request.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  return response.data
}, function (error) {
  // 对响应错误做点什么(默认axios会多包装一层data,需要相应拦截器中处理一下)
  return Promise.reject(error)
})

export default request

3. 获取图形验证码,请求测试

import request from '@/utils/request'
export default {
  name: 'LoginPage',
  async created () {
    const res = await request.get('/captcha/image')
    console.log(res)
  }
}

图形验证码功能

屏幕截图 2024-01-31 204255.png

1. 准备数据,获取图形验证码后存储图片路径,存储图片唯一标识

async created () {
  this.getPicCode()
},
data () {
  return {
    picUrl: '',
    picKey: ''
  }
},
methods: {
  // 获取图形验证码
  async getPicCode () {
    const { data: { base64, key } } = await request.get('/captcha/image')
    this.picUrl = base64
    this.picKey = key
  }
}

2. 动态渲染图形验证码,并且点击时要重新刷新验证码

<img v-if="picUrl" :src="picUrl" @click="getPicCode">

api 接口模块 -封装图片验证码接口

屏幕截图 2024-01-31 205228.png

屏幕截图 2024-01-31 205315.png

Toast轻提示

注册安装

import { Toast } from 'vant'
Vue.use(Toast)

两种使用方式

1. 导入调用 ( 组件内或非组件中均可)

import { Toast } from 'vant';
Toast('提示内容');

2. 通过this直接调用 (必须组件内)

本质:将方法,注册挂裁到了Vue原型上Vue.prototype.$toast = xxx

this.$toast('提示内容')