Vue积累-1

100 阅读2分钟

const { obj } = this.props 写法

const {dispatch} = this.props;

这段代码你可以认为是这样:

const dispatch = this.props.dispatch;

那样写是 ES6 的简写形式。

对象的hasOwnProperty

判断对象内是否有此属性

Object的hasOwnProperty()方法返回一个布尔值,判断对象是否包含特定的自身(非继承)属性。

var o = new Object();
o.prop = 'exists';

function changeO() {
  o.newprop = o.prop;
  delete o.prop;
}

o.hasOwnProperty('prop');  // true
changeO();
o.hasOwnProperty('prop');  // false

箭头函数

var elements = [
  'Hydrogen',
  'Helium',
  'Lithium',
  'Beryllium'
];

elements.map(function(element) {
  return element.length;
}); // 返回数组:[8, 6, 7, 9]

// 1. 上面的普通函数可以改写成如下的箭头函数
elements.map((element) => {
  return element.length;
}); // [8, 6, 7, 9]

// 2. 当箭头函数只有一个参数时,可以省略参数的圆括号
elements.map(element => {
 return element.length;
}); // [8, 6, 7, 9]

// 3. 当箭头函数的函数体只有一个 `return` 语句时,可以省略 `return` 关键字和方法体的花括号
elements.map(element => element.length); // [8, 6, 7, 9]

// 在这个例子中,因为我们只需要 `length` 属性,所以可以使用参数解构
// 需要注意的是字符串 "length" 是我们想要获得的属性的名称,而 `lengthFooBArX` 则只是个变量名,
// 可以替换成任意合法的变量名
elements.map(({ "length": lengthFooBArX }) => lengthFooBArX); // [8, 6, 7, 9]

export const

在这里插入图片描述在这里插入图片描述

Vuex

import * as api from '@/api/mapCommon.js';

const state = {
    // 矢量图配置信息
    vmapConfig: {
        mapEnable:0
    },
    // 测量方式(测距/测面)
    currMeasure: '',
    // 是否全屏
    isFullScreen: false
}

const mutations = {
    // 获取矢量图配置信息
    GET_VMAP_CONFIG (state, val) {	// 参数都是从第二个开始的,第一个就是上方的 state
        state.vmapConfig = val;
    },
    SET_CURR_MEASURE (state, val) {
        state.currMeasure = val;
    },
    SET_FULLSCREEN_STATUS (state, val) {
        state.isFullScreen = val;
    },
    CHANGE_FULLSCREEN_STATUS (state) {
        this.commit('mapCommon/SET_FULLSCREEN_STATUS', !state.isFullScreen);

    }
}

const actions = {
    getVmapConfig ({ commit }) {
        api.getVmapConfig().then(res => {
            res = JSON.parse(res)
            commit('GET_VMAP_CONFIG', res);
        });
    }
    getPermission({ commit }, userId) {
        return new Promise(async (resolve, reject) => {
            getPermission(userId).then(res => {
                const menuList = res.data.users[0].menuNodes
                commit('SET_MENU_LIST', menuList)
                resolve(menuList)
            }).catch(error => {
                reject()
            })
        })
    }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

mapState -> state

import { mapState } from 'vuex';

computed: {
    ...mapState({
        currMeasure: state => state.mapCommon.currMeasure,
    }),

},
this.$store.state.mapCommon.currMeasure	// 可直接调用

mutations

// 标记打点
setTag () {
    this.$store.commit('mapCommon/SET_CURR_MEASURE', '')	
    this.$emit('setTag')
},

mapActions -> actions

import { mapActions } from 'vuex'

methods: {
    // 方法 1 
    ...mapActions({
        getVmapConfig: 'mapCommon/getVmapConfig',	//...mapActions的方法	调用不同Module的数据必须这样写 mapCommon 这个是模块名
    }),
   // 方法 2
    getVehicleParams () {
        this.$store.dispatch('realTimeMonitor/getVehicleParams')	// 直接调用得方法
    }
}

this.$store.dispatch

两个方法都是传值给vuex的mutation改变state

dispatch:异步操作,数据提交至 actions ,可用于向后台提交数据
this.$store.dispatch('isLogin', true);

this.$store.commit

commit:同步操作,数据提交至 mutations ,可用于登录成功后读取用户信息写到缓存里
this.$store.commit('loginStatus', 1);

注:必须要用commit(‘SET_TOKEN’, tokenV)调用mutations里的方法,才能在store存储成功。

Mixin

import { regex } from '@/utils/validate'
export default {
    data() {
        return {
            validErrorMsg: {
                userName: '请输入1-50个字符且不包含空格 ‘ “ ;:& @',
                password: '请输入8-32字符且不包含空格 ‘ “ ;:& @',
            }
        }
    },
    methods: {
        /**
         * @description 校验方法
         * @param {Object} rule 校验规则
         * @param {String} value 值
         * @param {Function} callback 回调
         */
        regexEpValidRules(rule, value, callback) {
            if (regex[rule['validRule']].test(value)) {
                callback()
            } else {
                callback(new Error(this.validErrorMsg[rule['validRule']]))
            }
        },
    }
}

import mixin from '@/mixins'
export default {
    mixins: [mixin],
    
    methods: {
        toggleSideBar() {
            this.regexEpValidRules('app/toggleSideBar')	// 可以直接用
        },
    }
}

组件 props

<ddd aa-bb = 'cc' />

props: {
    cc:{
        type: String,
        default: ''
    },

父组件

<alarmImages
	v-if="!noImages"
	:picture-str="picture"
	:alarm-date="alarmDateStr"
	:location-name="locationName"
/>

import alarmImages from './alarmImages.vue'

export default {
    components: {
        alarmImages,
    },
}

子组件

<template>
  <div class="alarm-images">
    <div><span>{{ $t('alarm.modal.time') }}</span><span>{{ alarmDate }}</span></div>
    <div class="alarm-modal-address">
      <span>{{ $t('alarm.modal.address') }}</span><span>{{ locationName }}</span>
    </div>
    <img
      v-for="item in imageList"
      :key="item"
      :src="item"
      alt=""
      class="alarm-images-item"
    >
  </div>
</template>

<script>
import { queryAlarms } from '@/api/alarm-process/index.js'
export default {
    props: {
        pictureStr:{
            type: String,
            default: ''
        },
        alarmDate: {
            type: String,
            default: ''
        },
        locationName: {
            type: String,
            default: ''
        }
    },
    methods:{
    	changeFilter() {
            console.log(this.pictureStr)	// 直接在这里使用
        }
	}
}
</script>

this.$parent

this.$parent 可以访问到父组件 上所有的 data(){ 里的数据信息和生命周期方法,methods里的方法 }!