Vue解决问题小记

1.箭头函数解决function中访问this报错问题
at HTMLDivElement.eval (vehicleWarning.vue?3b7d:72)


wecom-temp-3ac472954edf6985ee245732dc0b347a.png
// 报错如下(迷惑点:$refs['warningList']正常是可以访问到的)
// 原因:函数里this的指向不再是外层了 
vehicleWarning.vue?3b7d:71 Uncaught TypeError: Cannot read properties of undefined (reading 'warningList')
    at HTMLDivElement.eval (vehicleWarning.vue?3b7d:72)
image.png

解决方案:使用箭头函数


image.png
**箭头函数基本特点**

**(1). 箭头函数this为父作用域的this,不是调用时的this**

箭头函数的this永远指向其父作用域,任何方法都改变不了,包括call,apply,bind。
普通函数的this指向调用它的那个对象。

let person = {
    name:'jike',
    init:function(){ //为body添加一个点击事件,看看这个点击后的this属性有什么不同
        document.body.onclick = ()=>{
            alert(this.name);//?? this在浏览器默认是调用时的对象是其父作用域的 
 }
    }
}
person.init();

上例中,init是function,以person.init调用,其内部this就是person本身,而onclick回调是箭头函数,
其内部的this,就是父作用域的this,就是person,能得到name。

let person = {
    name:'jike',
    init:()=>{ //为body添加一个点击事件,看看这个点击后的this属性有什么不同
        document.body.onclick = ()=>{
            alert(this.name);//?? this在浏览器默认是调用时的对象是全局window
 }
    }
}
person.init();

上例中,init为箭头函数,其内部的this为全局window,onclick的this也就是init函数的this,也是window,
得到的this.name就为undefined。

2.替换有赞组件中搜索框右边删除叉号的样式和点击事件,替换左边放大镜UI显示方案

            <van-sticky>
                <form action="/">
                    <van-search
                        v-model="searchText"
                        :left-icon="searchIcon" // 图标替换成自己的
                        :right-icon="rightIcon" // 图标替换成自己的
                        :clearable="false"
                        placeholder="搜索车牌号"
                        @search="onSearch"
                        @clear="onClear"
                        @input="inputChange"
                        @focus="inputChange"
                        @blur="endChange"/>
                </form>
            </van-sticky>
// js的data
        data () {
            return {
                current: '1',
                showPopup: false,
                searchText: '',
                searchIcon: require("@/assets/imgs/search.png"),
                rightIcon: require("@/assets/imgs/guanbi.png"),
                clearIcon: undefined
            }
        },
// 在mounted方法里获取元素添加自定义清除叉号事件
        mounted () {
            this.getVehCount({ partnerCode: '12', status: '1' });
            this.refreshData();
            var righticon = document.getElementsByClassName("van-field__right-icon")[0]; // 获取右边图标
            this.clearIcon = righticon;
            this.clearIcon.style.display = "none"; // 文字为空时默认不显示
            // 添加清除图标的点击事件
            this.clearIcon.addEventListener('click', () => {
                this.onClear()
            }, false);
        },
// 文字输入监听事件,来决定图标的显示或者隐藏
            inputChange () {
                if (this.searchText.length > 0) {
                    this.clearIcon.style.display = "block";
                } else {
                    this.clearIcon.style.display = "none";
                }
            },
            endChange () {
                // this.clearIcon.onclick = null
            },
            onSearch (val) {
                this.current = val;
                this.refreshData();
            },

            refreshData () {
                this.$nextTick(() => {
                    this.$refs['warningList'].refreshData(this.searchText);
                });
            },

            onClear () {
                this.searchText = ''
                this.refreshData();
                this.clearIcon.style.display = "none";
            },
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容