方案1:使用表单属性 autofocus
<input type="text" ref="ipt" placeholder="your name" autofocus>
搜索组件 Search.vue
import { useTemplateRef, onMounted } from 'vue';
const sql = useTemplateRef('sql')
onMounted(() => {
sql.value.focus()
})
<input type="text" ref="sql" placeholder="your keyword">
父组件 - 单击按钮显示搜索框
import { ref } from 'vue';
import Search from './components/Search.vue'
const isShow = ref(false)
<button @click="isShow = !isShow">click</button>
<Search v-if="isShow"></Search>
可以使用 v-show 吗?
模态框的显示隐藏和本案例有什么区别?
方案1:固定定位的元素变换样式,如添加阴影
<header> 固定在顶部 fixed;当滚动超过一定距离后,为 <header> 指定阴影
页面加载时,绑定事件处理器 - 监听页面的滚动事件
页面卸载时,移除绑定的事件处理器;别要注意定时器的清除
<header class="header" ref="header">header</header>
import { onMounted, onUnmounted, useTemplateRef } from 'vue'
const header = useTemplateRef('header')
const fn = () => {
header.value.classList.toggle('fixed', window.scrollY > 1000)
}
onMounted(() => {
window.addEventListener('scroll', fn)
})
onUnmounted(() => {
window.removeEventListener('scroll', fn)
})
1.2 使用动态类实现
<header class="header" :class="{ 'shadow': isShow }">header</header>
const isShow = ref(false)
onMounted(() => {
window.addEventListener('scroll', () => {
isShow.value = window.scrollY > 300
})
})
// ...
样式略
这里使用传统事件方式 - 建议使用事件侦听的方式
<div class="tab-box" ref="tab-box"></div>
import { onMounted, onUnmounted, useTemplateRef } from 'vue'
const tabBox = useTemplateRef('tab-box')
onMounted(() => {
window.onscroll = function () {
const rect = tabBox.value.getBoundingClientRect()
if (rect.top <= 0) {
tabBox.value.classList.add('sticky')
} else {
tabBox.value.classList.remove('sticky')
}
}
})
onUnmounted(() => {
window.onscroll = null
})
使用事件监听 addEventListener() 和 样式的 toggle() 优化,如使用具名函数便于清除事件侦听
onMounted(() => {
window.addEventListener('scroll', () => {
let rect = tabBox.value.getBoundingClientRect()
tabBox.value.classList.toggle('sticky', rect.top <= 0)
})
})