el-tree在vue3中全选和展开
1.前端url取参数以对象展示
2.el-tree在vue3中全选和展开
3.瀑布流4.瀑布流——前端流行网页布局方式5.vue中v-bind和v-model的区别是什么6.Vue中key的作用7.在Vue 3中,与Vue 2相比,有一些改进和优化的diff算法。8.浏览器解析html9.浏览器渲染HTML10.Object.entries()11.vue实现虚拟dom转换成真是dom的原理12.全局封装组件处理并发请求不连续的loading13.为什么vue数组下标修改监听不到14.Vue 3 在某些场景下可能表现出比 Vue 2 更低的性能15.vue里表单验证的v-model.number的坑16.有意思的css17.js原生语音转文字18.js手写一个call19.js手写一个apply20. 手写一个 bind 方法21.js寄生组合式继承22.react中的useState修改状态获取最新状态值23.函数柯里化js24.axios请求中断_下载中断和下载进度25.axios请求重试_核心原理26.axios请求重试_axios-retry插件27.虚拟列表-渲染 10 万条数据28.vue-office 组件29.threejs30.把原生 DOM 标签转换后加入到 3D 场景空间中显示31.three.js 物体要使用光线投射技术,计算是否点击位置与物体有交叉32.threejs基本函数33.二分查找算法34.js判断字符串是否连贯35.世界坐标系和模型坐标系36.设置车模型中每个小物体 castShadow = true37.Vue3 echarts 组件化使用 resizeObserver38.网页验证码的作用 *网页中几种常见验证码39.多个装饰器一起es6装饰器40.flex属性41.移动端兼容问题42.那什么是URL、URI、URN?43.threejs的坐标渲染和着色44.渲染管线45.着色器46.基于 three.js 加载器分别加载模型47.echarts自适应大屏方案 亲测有用48.js中关于class类的继承49.有趣的工具50.关于threejs中鼠标左右移动,左动看右边,右动看左边51.有趣的知识点threejs52.uniapp底层跨端原理53.防止XSS(跨站脚本攻击)漏洞54.启动vite和electron项目配置多个主进程55.九宫格css56.css伪类选择器57.uniapp关于uni.getUserProfile的使用58.uniapp有意思的api之openSetting59.处理flex布局60.uniapp登录板块封装(旧接口getUserInfo)61.uniapp获取用户信息62.在项目中使用UEditor碰到的几个问题63.一维数组转二位数组64.使用此函数对数组进行分块,并在最后一组添加特定的值65.如果win报错无法加载文件 C:\Users\xx\AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运行脚本66.win系统执行脚本报错策略更改无法加载文件 C:\Users\xx\AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运行脚本67.阅读时间缓存(快应用)68.uniapp去除button的边框69.uniapp中OnShow获取缓存70.js图片懒加载,在不做分页的情况下的解决方案71.width:100%与width:auto区别72.leetcode1047字符串反复去重(栈)73.记录一次uniapp使用scrollview74.微前端(矩阵项目)代码将单个文件合并到指定分支75.自适应高度的过渡76.实现下划线动画77.js不同类型比较78.登录后继续浏览之前的页面79.sse80.关于小说阅读前端翻页插件推荐turn.js81.数组扁平化82.好玩的vue组件83.DOMRect对象84.前端三大系列图解释85.js中关于return和if条件处理86.关于文心一言不能打开F12开发者工具87.js文字处理两端展示中间省略号88.[popover, select] el-popover内有select的时候在选择后会自动关闭89.说一下flex的属性90.vue3中404路由匹配规则91.shape-outside92.createRange表示文档中的一个范围——用于js判断文字添加省略号情况93.uniapp清除指定key缓存94.vue3+uniapp关于button的open-type无法生效95.uniapp+vue3 使用list触底+下拉96.diff算法vue97.动态修改manifest.json98.记录一下大小写导致的问题点击查看代码
<script setup lang="ts">
import { ref, reactive, computed, onBeforeMount } from 'vue'
import { menuPage, addRole, getRole, updateRole } from '@/utils/api/role'
import { ElTree, ElMessage } from 'element-plus'
interface Isex {
createBy: String
createTime: Number
id: String
remark: String
sort: Number
k: String
v: String
typeId: String
updateBy: String
updateTime: Number
}
let emit = defineEmits()
let props = defineProps<{
id?: string
show: boolean
}>()
const id = ref(props.id)
const formRef = ref(null)
let form = reactive({
roleName: '',
rolePerm: '',
enabled: 1,
descript: '',
})
let _show = computed({
get() {
return props.show
},
set(value) {
emit('update:show', value)
},
})
//控制菜单树
const permission = reactive({
openAll: false,
selectAll: false,
linkage: true,
treeList: [],
})
const treeRef = ref<InstanceType<typeof ElTree>>()
const onCancel = () => {
_show.value = false
}
const defaultProps = {
children: 'children',
label: 'name',
}
const toggleTreeCollapse = (value) => {
const nodes = treeRef.value.store.nodesMap
for (let i in nodes) {
nodes[i].expanded = value
}
}
const toggleTreeChecked = (value) => {
if (value) {
permission.treeList.map((m) => {
treeRef.value?.setChecked(m, true, true)
})
} else {
treeRef.value?.setCheckedKeys([])
}
}
const toggleTreeCheckedFs = (value) => {
permission.linkage = value
}
const normalizeData = (list) => {
// parentId 和 id 有联系 parentId为-1是一级列表
let newArr = []
let mapObj = {}
list.forEach((m) => {
mapObj[m.id] = m
})
list.forEach((mn) => {
if (mn.id === '-1') {
return newArr.push(mn)
}
const parObj = mapObj[mn.parentId]
if (parObj) {
parObj.children.push(mn)
} else {
newArr.push(mn)
}
})
return newArr
}
const addRolehander = () => {
let { roleName, rolePerm, enabled, descript } = form
let params = {
roleName,
rolePerm,
enabled,
descript,
permissionIds: treeRef.value!.getCheckedKeys(),
}
// 判断一下是否是添加或者编辑
id.value ? updateRoleHan(params) : addRoleHan(params)
}
const updateRoleHan = async (params) => {
// 拷贝一份数据
let data = Object.assign(params, { id: id.value })
let res = await updateRole(data)
if (res.code == '200') {
ElMessage({
type: 'success',
message: '修改成功',
})
_show.value = false
emit('change')
}
}
const addRoleHan = async (params) => {
let res = await addRole(params)
if (res.code == '200') {
ElMessage({
type: 'success',
message: '添加成功',
})
_show.value = false
emit('change')
}
}
onBeforeMount(async () => {
let {
data: { records },
} = await menuPage({ current: 1, size: 1000 })
// permission.treeList = records
// 数据处理tree
let treeLists = normalizeData(records)
permission.treeList = treeLists
if (id.value) {
let getRoleId = await getRole(id.value)
let { role, permissions } = getRoleId.data
//单独修改一下数据类型
role.enabled = role.enabled.toString()
//表单value值
Object.assign(form, role)
//菜单权限id
treeRef.value.setCheckedKeys(permissions)
}
})
</script>
<template>
<div class="roleEditor-page">
<el-dialog
:modelValue="_show"
width="600px"
:title="id ? '修改' : '新增'"
:append-to-body="true"
:destroy-on-close="true"
>
<el-form v-model="form" ref="formRef">
<el-form-item label="角色名称" prop="roleName">
<el-input placeholder="请输入角色名称" v-model="form.roleName" />
</el-form-item>
<el-form-item label="权限字符" prop="rolePerm">
<el-input placeholder="请输入权限字符" v-model="form.rolePerm" />
</el-form-item>
<el-form-item label="状态" prop="rolePerm">
<el-radio-group v-model="form.enabled">
<el-radio :label="1">启用</el-radio>
<el-radio :label="0">禁用</el-radio>
</el-radio-group>
</el-form-item>
<!-- start -->
<el-form-item label="菜单权限">
<div class="checkB">
<el-checkbox
v-model="permission.openAll"
@change="toggleTreeCollapse"
>
展开/折叠
</el-checkbox>
<el-checkbox
v-model="permission.selectAll"
@change="toggleTreeChecked"
>全选/全不选</el-checkbox
>
<el-checkbox
v-model="permission.linkage"
@change="toggleTreeCheckedFs"
>父子(联动/不联动)
</el-checkbox>
<el-tree
ref="treeRef"
:data="permission.treeList"
:check-strictly="!permission.linkage"
show-checkbox
node-key="id"
:props="defaultProps"
class="treeB"
/>
</div>
</el-form-item>
<!-- end -->
<el-form-item label="备注" prop="descript">
<el-input
type="textarea"
placeholder="请输入内容"
v-model="form.descript"
:maxlength="200"
show-word-limit
/>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="onCancel">取消</el-button>
<el-button type="primary" @click="addRolehander">确认 </el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<style lang="scss" scoped>
.checkB {
width: 100%;
}
.treeB {
margin-top: 0.5rem;
background-color: #fff;
border: 1px solid #dcdfe6;
border-radius: 4px;
}
</style>
本文来自博客园,作者:jialiangzai,转载请注明原文链接:https://www.cnblogs.com/zsnhweb/articles/17678437.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异