[关闭]
@anoninz 2017-08-29T03:47:20.000000Z 字数 1858 阅读 1719

Vue.js 使用技巧和一些坑

Vue axios


在 Vue 工程全局使用一些插件:

方法一: 原型

  1. 在入口文件 import 插件,并通过Object.definePrototype()Vue 对象设置绑定 prototype 属性
  2. 在每个 Vue 对象中直接访问这个属性。例如:
  1. // 在 main.js ( entry.js ) 中
  2. import moment from 'moment';
  3. Object.defineProperty(Vue.prototype, '$moment', { value: moment });
  4. // 在不同的 Vue 组件中访问 this.$moment()
  5. export default {
  6. created() {
  7. console.log('The time is ' . this.$moment().format("HH:mm"));
  8. }
  9. }

方法二:插件(类似vue-router的用法)

  1. 封装自己的插件: plugin.js
  1. export default {
  2. install: function(Vue) {
  3. // Do stuff
  4. }
  5. }
  6. // 举例,自己封装一个 axios 插件 axios.js
  7. import axios from 'axios'
  8. export default {
  9. install: function(Vue, name = '$http') {
  10. Object.defineProperty(Vue.prototype, name, { value: axios })
  11. }
  12. }
  1. 使用
  1. // 在入口文件
  2. import AxiosPlugin from './axios.js'
  3. Vue.use(AxiosPlugin, '$axios')
  4. new Vue({
  5. created() {
  6. console.log(this.$axios ? 'Axios works!' : 'Uh oh..')
  7. }
  8. })

使用 axios 代替 $.ajax() 的坑

axios 中文文档

使用 $.ajax() 可以正常取到数据,但 axios 不行

报错信息:

  1. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access.”

出错原因是 axios 默认使用 json 格式来提交数据。而服务器可能要的是 formdata 格式

解决办法:使用 qs 插件处理data数据

  1. axios({
  2. method: 'post',
  3. url: '/api',
  4. data: qs.stringify({
  5. ts: new Date().getTime(),
  6. method: 'index.getIndexInfo',
  7. }),
  8. })

懒加载插件:v-lazy

插件的官方地址
$ npm install vue-lazyload --save
1. 在入口函数引用

  1. // main.js
  2. import Vue from 'vue'
  3. import App from './App.vue'
  4. import VueLazyload from 'vue-lazyload'
  5. Vue.use(VueLazyload, {
  6. preLoad: 1.3, // 预加载的比例 1.3个屏高?
  7. error: 'dist/error.png', // 下载出错时的图片
  8. loading: 'dist/loading.gif', // 等待图片
  9. attempt: 1 // 加载时间 1s?
  10. })

2.在组件里面使用

  1. 1. img src 单个图片
  2. <img v-lazy="imgUrl" />
  3. 2. div background-image 背景图片
  4. <div v-lazy:background-image="imgUrl"></div>

3.在 全局/组件 内监听加载事件,来刷新容器的高度

  1. vm.$Lazyload.$on('loaded', function ({ el, src }) {
  2. console.log(el, src)
  3. })
  4. created: function () {
  5. this._getIndexInfo()
  6. this.$Lazyload.$on('loaded', () => {
  7. this.$refs.scroll.refresh()
  8. })
  9. },
  10. 对于 scroll-list 组件:子组件监听 loaded 事件,并向父组件传递 'load' 事件
  11. this.$Lazyload.$on('loaded', () => {
  12. this.$emit('load')
  13. })
  14. 父组件在收到 'load' 时,触发刷新
  15. <component @load="loadImg"></component>
  16. loadImg: () => {
  17. this.$refs.scroll.refresh()
  18. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注