问题描述: 加载该组件的时候, 浏览器报错。 求指导。
<template>
<div>
<div class="search">
<input v-model="keyword" class="search-input" type="text" placeholder="输入城市名或拼音">
</div>
<div class="search-content" ref="search" v-if="keyword">
<ul>
<li class="search-item border-bottom" v-for="item in list" :key="item.id" @click="handleCityClick(item.name)">
{{ item.name }}
</li>
<li class="search-item border-bottom" v-if="hasNoData">没有找到匹配数据!</li>
</ul>
</div>
</div>
</template>
<script lang="ts">
import {defineComponent} from 'vue'
import BScroll from '@better-scroll/core'
export default defineComponent({
name: "CitySearch",
props: {
cities: Object
},
data() {
return {
keyword: '',
list: [],
timer: null,
uptime: null
}
},
methods: {
initBscroll() {
this.scroll = new BScroll(this.$refs.search, {
scrollY: true
})
},
handleCityClick(cityName: any) {
this.$store.dispatch('changeCity', cityName);
this.$router.push('/')
}
},
updated() {
if (this.uptime) {
clearTimeout(this.uptime)
}
this.uptime = setTimeout(() => {
this.initBscroll()
}, 200);
},
computed: {
hasNoData() {
return !this.list.length
}
},
mounted() {
//this.scroll = new BScroll(this.$refs.search);
// this.$nextTick(()=>{
// this.scroll = new BScroll(this.$refs.search);
// });
// setTimeout(() => {
// this.initBscroll()
// }, 150);
},
watch: {
keyword() {
if (this.timer) {
clearTimeout(this.timer)
}
if (!this.keyword) {
this.list = []
return
}
this.timer = setTimeout(() => {
const result = []
for (let i in this.cities) {
this.cities[i].forEach((value) => {
if (value.spell.indexOf(this.keyword) > -1 || value.name.indexOf(this.keyword) > -1) {
result.push(value)
}
})
}
this.list = result;
}, 50);
}
}
})
</script>
<style lang="stylus" scoped>
@import "../src/assets/styles/varibles.styl"
.search
height .72rem
padding 0 .1rem
background $bgColor
.search-input
box-sizing border-box
width 100%
height .62rem
padding 0 .1rem
line-height .62rem
text-align center
border-radius .06rem
color #666
.search-content
z-index 1
overflow: hidden
position absolute
top 1.58rem
left 0
right 0
bottom 0
background #eee
.search-item
line-height .62rem
padding-left .2rem
color #666
background #ffffff
</style>
https://blog.csdn.net/xueli_2017/article/details/90717920 参考一下
this.$refs.search获取dom元素,而你dom元素让用v-if。当不等于true时获取不到refs.search肯定报错加个判断
if(this.$refs.search){ //非空判断 search存在再赋值
this.scroll = new BScroll(this.$refs.search, {
scrollY: true
})
}