近期项目总结

1、Vuex的模块化(使用modules实现)

(1)每个模块中可以设置state,mutations,actions

const state = {}
const mutations = {}
const actions = {}
export default {
  namespaced: true, // 开启命名空间
  state,
  mutations,
  actions
}

(2)每个模块开启自己的命名空间:namespaced: true

(3)使用模块中的state数据:$store.state.模块名.数据名

(4)使用模块中mutations中的方法

// 方法一
...mapMutations(['模块名/方法名'])
this['模块名/方法名']()

// 方法二
...mapMutations('模块名', ['方法一', '方法二'])
this.方法一()
this.方法二()
2、scss语法

(1)使用$符号声明样式变量

$highlight-color: #f90;

(2)以空格分割的样式也可以设置为变量

$basic-border: 1px solid #000;

(3)变量范围(样式块中定义的变量,只能在当前样式块中定义)

(4)嵌套语法

(5)&父选择器

a {
  color: black;
  &:hover {
    color: skyblue;
  }
}
3、修饰符

enter 按键修饰符

native 监听组件的原生事件

4、跨域解决方案

(1)jsonp:不支持post

(2)cors:后端配置请求头

(3)反向代理:

  • 原理:向本地服务器发送请求,本地服务器再请求线上服务器,服务器之间通信没有跨域问题

  • 在vue-cli中进行配置

    • vue.config.js中的devServer中进行配置
    • 配置:
    proxy: {
      '/api': {
        target: '', // 代理地址
        changeOrigin: true, // 是否跨域
        // 路径重写(将localhost:8888/api/login修改为www.xxxx.com/login)
        pathRewrite: {
          '^/api': ''
        }
      }
    }
    
5、路由导航守卫

(1)前置守卫

router.beforeEach((to, from, next) => {
  // to 跳转到的页面
  // from 跳转前的页面
  /**
   * next是前置守卫必须执行的钩子
   * next() 放过
   * next(false) 跳转终止
   * next(路径) 跳转到指定路径
   */
})

(2)后置守卫

router.afterEach(() => {
  // 页面已经跳转
})
6、vue中不支持响应式的2种情况

(1)直接通过数组下标来修改元素内容:list[0] = 666

(2)给对象追加新的属性并赋值:person.password = 666,password是新增属性

(3)可以通过以下方式进行修改,就能触发响应

this.$set(数组/对象, 数组索引/对象字段, 具体值)

eg:this.$set(list, 0, 666)

7、图片地址报错设置默认图片问题(使用自定义指令)

如果希望增强标签的功能时,可以考虑自定义属性

/** 将自定义指令的第二个参数对象抽离出来 */
export const imagerror = {
  // inserted在当前dom元素插入到节点之后执行
  inserted(dom, options) {
    // options是指令中的变量的解释,指令中传的值在options.value中
    // dom 当前指令作用的dom元素
    // 图片有地址,地址没有加载成功,会报错,报错会触发onerror事件
    dom.onerror = function() {
      dom.src = options.value
    }
  }
}

// 头像设置代码
<img v-imagerror="默认显示的图片"
		 :src="请求到的但是显示不出来的图片">
8、注册全局指令

(1)将指令的对象写在一个单独的js文件中,然后每一个对象按需导出

(2)在main.js中导入,然后循环注册

// main.js
import * as directives from '指令文件'

Object.keys(directives).forEach(key => {
  Vue.directive(key, directives[key])
})
9、图片路径问题
  • 如果图片路径写在{{}}中或css中,项目打包后会自动进行编译

  • 如果图片路径直接写在js中,不会自动编译,在项目打包后会出现问题,图片无法显示

  • 解决方式:

    defaultImg: require('图片的路径')
    
10、vue的函数式组件

(1)属性:functinal: true

(2)特点:没有data状态,没有响应式,只会接收props属性,没有this

(3)使用render函数渲染节点

// 图标组件
<script>
export default {
  name: 'MenuItem',
  functional: true, // 这个组件是一个函数式组件,没有data状态,没有响应式,只会接收props,没有this
  props: {
    icon: {
      type: String,
      default: ''
    },
    title: {
      type: String,
      default: ''
    }
  },
  render (h, context) {
    const { icon, title } = context.props
    const vnodes = []

    if (icon) {
      if (icon.includes('el-icon')) {
        vnodes.push(<i class={[icon, 'sub-el-icon']} />)
      } else {
        vnodes.push(<svg-icon icon-class={icon} />)
      }
    }

    if (title) {
      vnodes.push(<span slot='title'>{(title)}</span>)
    }
    return vnodes
  }
}
</script>

<style scoped>
.sub-el-icon {
  color: currentColor;
  width: 1em;
  height: 1em;
}
</style>

11、将列表型数据转化为树形数据
function transListToTreeData(list, rootValue = '') {
  var arr = []
  list.forEach(item => {
    if (item.pid === rootValue) {
      const children = transListToTreeData(list, item.id)
      if (children.length > 0) {
        item.children = children
      }
      arr.push(item)
    }
  })
  return arr
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值