Vuex、axios

阶段四:vuex

vuex: 全局状态管理器  适用于任意组件关系数据共享  

安装:
npm install vuex@3 -S (建议安装项目的时候 直接勾选中 无需手动安装  uniapp默认已有 无需安装)

vue2 -> vuex3
vue3 -> vuex4

https://v3.vuex.vuejs.org/zh/


集成:
store/index.js :

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {

  },
  mutations: {

  },
  actions: {

  }
})

main.js :

import store from './store' 
new Vue({
  store
  ......... 其他代码 ........
}).$mount('#app')

---------------------------------------
state:
方式一:模板中直接输出    uniapp不可以  有兼容问题 小程序中不能正常显示  不建议
{{$store.state.count}}

方式二:手写计算属性 
count() {
  return this.$store.state.count
}

方式三:利用vuex 准备的 mapState 辅助函数;在computed中使用:
...mapState(['testa', 'testb', 'testc']), // 本地计算属性名和state变量 同名 用数组
...mapState({  // 本地计算属性名自定义和state名不一样  用对象
  mycount : 'count'
})

如果你的计算属性有特殊业务,请使用方式二手戳。

mutaions:
方式一:自行调用
this.$store.commit('countJia', num)

方式二:利用vuex 准备的 mapMutations 辅助函数;在methods中使用:
...mapMutations({myjia : 'countJia'}),
...mapMutations(['countJian']),


actions:
方式一:自行调用
this.$store.dispatch('syncCountJia', num)

方式二:利用vuex 准备的 mapActions 辅助函数;在methods中使用:
...mapActions(['syncCountJia', 'syncCountJian'])

getters:
方式一:模板中直接输出    uniapp不可以  有兼容问题 小程序中不能正常显示  不建议
{{$store.getters.countPf}}

方式二:手写计算属性
countPf() {
  return this.$store.getters.countPf
}

方式三: 利用vuex 准备的 mapGetters 辅助函数;在computed中使用:
...mapGetters(['countPf'])  可以是数组和对象 

-----------------------------------------
npm i -S axios

url   :  统一资源定位符 

    https://www.baidu.com:8080/a/b/xx.php?参数名=值&参数名=值
    协议://域名或ip:端口/目录/文件名?参数名=值&参数名=值

    http  80
    https 443


请求方式:GET  POST   PUT  DELETE  

参数 : 数据 

请求头 : 键值对 

import axios from 'axios'

axios.get(url地址)
axios.get(url地址?参数名=值&参数名=值)
axios.get(url地址, {
    params : {
        参数名:值,
        参数名: 值
    }
})

axios.get(url地址, {
    params : {
        参数名:值,
        参数名: 值
    },
    headers: {
        头名: 值
    }
})


axios.post(url地址, {参数名:值, 参数名:值})

let token = sessionStorage.getItem('token')
axios.post(url地址, {参数名:值, 参数名:值}, {
    headers: {
        Authorization: 'Bearer ' + token
    }
})

axios.get(url地址).then(result => {
    // 表示 请求成功了 result参数就响应数据
    
})
 

npm i -S axios
npm i -S nprogress  发请求的时候可以做进度条

import axios from 'axios'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'

// 请求拦截和响应拦截
const request = axios.create({
  baseURL : 'http://demo4.wooadmin.cn',
  timeout: 50000
})
request.interceptors.request.use((config) => {
  NProgress.start();
  // 请求拦截 -- 每次发送请求的时候 都可以执行到这里
  let token = window.sessionStorage.getItem('token')
  if (token) {
    config.headers.Authorization = `Bearer ${token}`;
  }
  return config;
}, (err) => {
  NProgress.done();
  Promise.reject(err);
})

request.interceptors.response.use((response) => {
  NProgress.done();
  // 响应拦截 -- 每次响应回来的时候 都可以执行到这里的代码
 
  return response.data ? response.data :response;
}, (err) => {
  NProgress.done();
  //404 500 
  
  //console.log(err.response.status);
  Promise.reject(err);
})

// axios 原始的get方法代码赋值给 originGet
const originGet = request.get;

// 替换axios 原本的get 
request.get = (url, params = {}, config = {}) => {
  config.params = params;
  return originGet(url, config)
}

export default request;

----------------------
// 把所有的接口都定义在一个模块中
import axios from "./request"

export default{
  captcha(captcha_key) {
    return axios.get('/api/Other/captcha',{captcha_key})
  },
  login(username, password,captcha_key, captcha) {
    return axios.post('/api/UserLogin/login', {username, password,captcha_key, captcha})
  },
  getInfo() {    
    return axios.get('/api/UserLogin/getInfo')
  }
}
-----------------------------------------
UI组件库:
https://vant-contrib.gitee.io/vant/v2/#/zh-CN/

cnpm i vant@latest-v2 -S
npm i babel-plugin-import -D

babel.config.js:
module.exports = {
  presets: [
    '@vue/cli-plugin-babel/preset'
  ],
  plugins: [
    ['import', {
      libraryName: 'vant',
      libraryDirectory: 'es',
      style: true
    }, 'vant']
  ]
}
---------------------------------------
项目:
 (*) Choose Vue version
 (*) Babel
 ( ) TypeScript
 ( ) Progressive Web App (PWA) Support
 (*) Router
 (*) Vuex
>(*) CSS Pre-processors

? Please pick a preset: Manually select features
? Check the features needed for your project: Choose Vue version, Babel, Router, Vuex, CSS Pre-processors
? Choose a version of Vue.js that you want to start the project with 2.x
? Use history mode for router? (Requires proper server setup for index fallback in production) No
? Pick a CSS pre-processor (PostCSS, Autoprefixer and CSS Modules are supported by default): Less
? Where do you prefer placing config for Babel, ESLint, etc.? In package.json
? Save this as a preset for future projects? No


依赖:
cnpm i -S axios       发请求
cnpm i -S nprogress   发请求的时候 可以显示进度条
cnpm i -S dayjs       用户日期格式化     还有一个叫 moment的扩展 也是用来处理时间的
cnpm i -S lodash      (本次项目是否安装,自行考虑)   很多开发中经常遇见的使用函数、方法

cnpm i vant@latest-v2 -S       Vant UI组件库
cnpm i babel-plugin-import -D  按需加载

https://blog.csdn.net/weixin_45799605/article/details/113310110
移动端适配       针对移动端项目才考虑
cnpm i lib-flexible -S
cnpm i postcss-pxtorem@5.1.1 -D

babel.config.js:

module.exports = {
  presets: [
    '@vue/cli-plugin-babel/preset'
  ],
  plugins: [
    ['import', {
      libraryName: 'vant',
      libraryDirectory: 'es',
      style: true
    }, 'vant']
  ]
}

poastcss.config.js:

module.exports = {
  plugins: {
    "postcss-pxtorem": {
      // 设计稿 375:37.5
      // 设计稿:750:75
      // Vant 是基于 375
      rootValue: 37.5,
      propList: ["*"]
    }
  }
}


main.js:

import 'lib-flexible/flexible'  //加一行导入


public/index.html
把原来的那行替换掉:

<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0; viewport-fit=cover" name="viewport" />

dayjs简单用法参考:
import dayjs from 'dayjs'
dayjs(1318781876406).format('YYYY-MM-DD HH:mm:ss');

目录结构,建议的添加:

https :
  request.js   用于请求和响应拦截
  index.js     所有的接口都应该定义在该文件
    你的每个组件中就可以通过 this.$api 获取到所有接口方法了

utils :   用于放公共模块库  
  arr.js   用于封装数组相关的数据处理方法 
  str.js   用于封装字符串相关的数据处理方法 
  mixins.js  全局混入

plugin:
  index.js  插件 用于处理全局性业务(全局组件注册、全局过滤器、全局指令、全局数据....)

  
less:
<style lang="less"></style>
<style lang="scss"></style>

变量:
@color:red;
.div1{
  background: @color;
}

嵌套选择器:
.a{
  color: red;
  .b{
    font-size: 30px;
    .c{
      font-weight: bold;
    }
    &.d{
      background: green;
    }
  }
  .d{
    text-decoration: underline;
  }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值