vue 树结构文字过长隐藏文字,鼠标移入显示

博客介绍了在utils下新建filters.js文件并在min.js引入,以实现el-tree节点名称超过10个字符后进行省略,鼠标操作显示全部内容的功能,还附带了相关参考地址。

在utils下新建一个filters.js文件 内容

/**
 * 省略多余字符,用...显示
 * @param {String} value
 * @param {number} len
 */
export function ellipsis(value, len) {
  if (!value) return ''
  if (value.length > len) {
    return value.slice(0, len) + '...'
  }
  return value
}

在min.js引入

import * as filters from "@/utils/filters"


Object.keys(filters).forEach(key => {
  Vue.filter(key, filters[key]);
});
 <span class="custom-tree-node" slot-scope="{ node, data }">
            <el-tooltip class="item" effect="dark" :content="node.label" placement="top-start">
              <span>{{ node.label | ellipsis(5) }}</span>
            </el-tooltip>
<span>

可以带一个title超过10以后在显示,

:title="node.label.length>10?node.label:''"

附带参考地址:el-tree节点名称太长省略,且鼠标点击显示全部内容,Vue实现_HuiRonmantic的博客-优快云博客

el-tree节点名称太长省略,且鼠标移入显示全部内容,Vue2实现_子恒吃西瓜的博客-优快云博客

<think>好的,我现在需要帮助用户解决在el-tree组件中实现鼠标移入显示功能按钮、移出隐藏的问题。根据用户提供的引用内容,我需要综合这些信息,整理出一个清晰的解决方案。 首先,用户引用了三个不同的来源,都是关于如何在el-tree中处理鼠标事件来控制按钮的显示隐藏。引用1提到动态添加dropdownShow属性,并处理高度和点击事件的问题。引用2展示了具体的代码结构,使用了mouseover和mouseout事件,并通过$set方法更新数据属性。引用3则使用了mouseenter和mouseleave,以及一个del字段来控制显示。我需要比较这些方法,找出最佳实践。 接下来,我需要考虑用户的需求:当鼠标移入节点时显示功能按钮,移出时隐藏。需要注意的问题可能包括事件冒泡、节点间切换时的显示问题,以及如何正确绑定事件到元素上。 根据引用内容,动态添加属性到数据对象中是关键,比如dropdownShow或del。这样每个节点可以独立控制按钮的显示状态。此外,正确绑定鼠标事件到对应的元素上,比如span标签,可能需要设置样式以确保事件触发的区域覆盖整个节点,避免出现部分区域无法触发的问题。例如,引用2中提到设置高度为100%来避免节点间隔导致的显示问题。 另外,引用1和引用3提到使用mouseover/mouseout和mouseenter/mouseleave的区别。需要理解这两组事件的不同:mouseenter和mouseleave不会冒泡,而mouseover和mouseout会。这意味着如果子元素触发事件,可能会导致父元素的事件处理出现问题。因此,使用mouseenter和mouseleave可能更合适,因为它们不会冒泡,能更准确地处理节点内的鼠标行为。 还需要注意Vue的响应式问题,直接修改数据属性可能不会触发视图更新,因此使用$set方法是必要的,如引用2和3所示。这确保了属性的变化能够被Vue检测到并更新DOM。 最后,要处理点击事件与el-tree默认行为的冲突,比如引用1中提到的用@click.stop来阻止事件冒泡,避免触发节点的展开或选中事件。这需要在下拉按钮的点击事件中添加.stop修饰符。 综合以上分析,解决方案应包括以下步骤:使用mouseenter和mouseleave事件,动态设置数据中的属性(如showActions),通过$set确保响应式更新,设置CSS样式确保事件区域覆盖整个节点,以及处理点击事件以防止冒泡。这样能够实现鼠标移入显示按钮,移出隐藏,并且避免常见的显示和交互问题。</think>### 实现步骤及代码示例 #### 一、核心实现原理 1. **动态属性控制**:通过给树节点数据添加`showActions`字段(或任意自定义字段)控制按钮显隐状态[^1][^2][^3] 2. **事件绑定**:使用`mouseenter`和`mouseleave`事件(比`mouseover/mouseout`性能更优,避免事件冒泡问题)[^3] 3. **样式覆盖**:确保事件绑定区域覆盖整个节点高度,避免移动时状态更新不及时 #### 二、完整实现代码 ```html <template> <el-tree :data="treeData" :props="defaultProps" node-key="id" class="custom-tree" @node-click="handleNodeClick"> <span slot-scope="{ node, data }" class="tree-node" @mouseenter="showActions(data)" @mouseleave="hideActions(data)"> <span>{{ node.label }}</span> <span v-if="data.showActions" class="action-buttons"> <el-button @click.stop="handleEdit(data)" icon="el-icon-edit" size="mini"></el-button> <el-button @click.stop="handleDelete(data)" icon="el-icon-delete" size="mini" type="danger"></el-button> </span> </span> </el-tree> </template> <script> export default { data() { return { treeData: [ { id: 1, label: &#39;节点1&#39;, children: [...] } ], defaultProps: { children: &#39;children&#39;, label: &#39;label&#39; } } }, methods: { showActions(data) { this.$set(data, &#39;showActions&#39;, true) }, hideActions(data) { this.$set(data, &#39;showActions&#39;, false) }, handleEdit(data) { /* 编辑逻辑 */ }, handleDelete(data) { /* 删除逻辑 */ } } } </script> <style> .custom-tree .el-tree-node__content { height: 40px; /* 必须设置固定高度 */ } .tree-node { display: flex; align-items: center; width: 100%; height: 100%; /* 关键样式:确保区域覆盖 */ } .action-buttons { margin-left: auto; padding-left: 10px; } </style> ``` #### 三、关键实现细节 1. **$set的必要性**:直接修改`data.showActions = true`不会触发视图更新,必须使用`this.$set`[^2][^3] 2. **@click.stop的作用**:阻止按钮点击事件冒泡到树节点,避免触发`node-click`事件[^1] 3. **高度设置的原理**:通过CSS确保`.el-tree-node__content`和`.tree-node`高度一致,避免鼠标快速移动时状态不同步[^1] 4. **性能优化**:使用`mouseenter/mouseleave`替代`mouseover/mouseout`,前者不会触发事件冒泡,减少不必要的重渲染[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值