yw-common-list
Version:
基于vxe-table封装的自定义可配置表格
67 lines (61 loc) • 3.05 kB
JavaScript
// directives/pickerClearable.js
const pickerClearable = {
// 使用 bind 钩子,更早地获取组件实例并尝试监听
bind (el, binding, vnode) {
const picker = vnode.componentInstance
if (!picker) {
console.warn('[pickerClearable] 未获取到组件实例')
return
}
// console.log('[pickerClearable] 指令已绑定', picker)
// 标记是否已插入按钮,避免重复操作
let inserted = false
// 使用 $watch 来监听 pickerVisible 属性的变化,
// 这比 $on('visible-change') 更底层、更可靠,因为它直接关联到组件内部状态。
// 需要在组件实例上 $watch,因为它不是响应式的。
// 注意:pickerVisible 是组件内部属性,这种监听方式需要确保组件已初始化,但它仍然比事件监听更直接。
// 我们可以结合 $nextTick 来确保组件内部状态已就绪。
picker.$nextTick(() => {
// 监听 pickerVisible 的变化
picker.$watch('pickerVisible', (newVal) => {
// console.log('[pickerClearable] pickerVisible 变为: ', newVal)
if (newVal && !inserted) {
// 面板打开,且按钮未插入,执行插入逻辑
// 等待 DOM 更新,确保面板元素已渲染
picker.$nextTick(() => {
// ... (查找 panel 和 footer 并插入按钮的代码,与之前一致) ...
// 为了简洁,此处省略查找和插入的 DOM 操作代码,直接复用你之前的逻辑。
// 关键变化是触发的时机改为了监听 pickerVisible。
let panel = el.querySelector('.el-picker-panel')
if (!panel) {
const panels = document.querySelectorAll('.el-picker-panel')
if (panels.length) panel = panels[panels.length - 1]
}
if (!panel) return
const footer = panel.querySelector('.el-picker-panel__footer')
if (!footer ||
footer.querySelector('.custom-picker-clear-btn')) return
const btn = document.createElement('button')
btn.textContent = '清空'
btn.className = 'el-button el-button--text el-button--mini el-picker-panel__link-btn'
btn.classList.add('custom-picker-clear-btn')
btn.addEventListener('click', (e) => {
e.stopPropagation()
picker.$emit('input', null)
picker.handleClose()
})
footer.insertBefore(btn, footer.firstChild)
inserted = true
// console.log('[pickerClearable] 清空按钮已插入')
})
}
})
})
}/*,
// 可以保留 inserted 作为备用,但主要逻辑移到 bind 中
inserted (el, binding, vnode) {
// 可以留空或添加简单日志,但核心逻辑已在 bind 中处理
// console.log('[pickerClearable] inserted 触发,逻辑已由 bind 处理')
} */
}
export default pickerClearable