【uniapp】uview-plus常用组件

news/2024/10/18 10:45:19/文章来源:https://www.cnblogs.com/yiping5/p/18473783

常用下拉单选

com-select.vue

<template><view><up-iconv-if="mode === 'text'"name="arrow-down":label="inputValue || placeholder"labelPos="left":labelSize="fontSize":size="14"@click="openActionSheet"></up-icon><up-inputv-elsev-model="inputValue"clearable:fontSize="fontSize"suffixIcon="arrow-down":placeholder="placeholder"@click="openActionSheet"/><up-picker:show="visible":columns="columns":closeOnClickOverlay="true"cancelText="清空":keyName="labelName"@confirm="onSelectAction"@close="visible = false"@cancel="handleClear()"/></view>
</template><script setup lang="ts">
import { ref } from 'vue';
let visible = ref(false);
let inputValue = ref('');// 定义props
const props = defineProps({value: String,columns: Array,placeholder: String,labelName: String,valueName: String,mode: String,fontSize: [String , Number]
});
props.labelName ? (inputValue.value = '全部') : (inputValue.value = '');// 点击文本框,显示底部选项面板
const openActionSheet = () => {visible.value = true;
};// 选择某个选项,关闭选项面板
const emit = defineEmits(['input']);
const onSelectAction = (action: any) => {visible.value = false;props.labelName? (inputValue.value = action.value[0]?.[props.labelName]): (inputValue.value = action.value[0]);if (props.labelName) {emit('input', action.value[0]?.[props.valueName || 'value']);} else {emit('input', inputValue.value);}
};/** 清空 */
const handleClear = () => {visible.value = false;props.labelName ? (inputValue.value = '全部') : (inputValue.value = '');emit('input', '');
};
</script><style lang="scss"></style>

常用tag

common-tag.vue

<template><up-tagclass="com-tag":text="text":type="currentItem.color":plain="currentItem.plain"></up-tag>
</template><script setup lang="ts">
import { computed } from 'vue';
interface ListItem {value?: string;label?: string;color?: string;plain?: boolean;
}
interface Props {value: string | number;list: ListItem[];labelName?: string;valueName?: String;shape?: String;
}// 定义props
const props = withDefaults(defineProps<Props>(), {list: () => [],labelName: () => 'label',valueName: () => 'value'
});
const currentItem = computed(() => {return ((props.list || []).find((item: ListItem) => String(item[props.valueName]) === String(props.value)) || {});
});
const text = computed(() => {return currentItem.value[props.labelName];
});
</script><style lang="scss"></style>

树形

common-tree.vue

<template><view class="tree-panel"><tree-nodeclass="tree-box":data="treeShowData":labelKey="labelKey":idKey="idKey"@click="checkNode"><template #default="{ node }"><slot :node="node">{{ node[labelKey] }}</slot></template></tree-node><view v-show="!treeShowData.length" class="empty">暂无数据</view ></view>
</template>
<script setup lang="ts">import TreeNode from './tree-node.vue';import { ref, watch, computed, defineExpose } from 'vue';export interface Props {data: any[];treeProp?: any;checkable?: boolean;}const props = withDefaults(defineProps<Props>(), {treeProp: {},checkable: false,});const emit = defineEmits<{(e: 'check', checkList: any[]): void;(e: 'click', current: object): void;}>();defineExpose({clearCheck,inputSearch,inputClear,checkNodeByKey,});const labelKey = computed(() => {return props?.treeProp?.labelKey || 'label';});const idKey = computed(() => {return props?.treeProp?.idKey || 'id';});const keyword = ref(''); //查询关键字const checkList = ref([] as any); //选中列表const treeShowData = ref(props.data as any); //树形数据-实际显示watch(() => props.data,(val) => {treeShowData.value = val || [];},{ immediate: true },);// 搜索-确认const inputSearch = (e: any) => {keyword.value = e.value;if (!keyword.value) {treeShowData.value = props.data;} else {treeShowData.value = searchTree(props.data, keyword.value, true);}};// 搜索-清空const inputClear = () => {treeShowData.value = props.data;};// 搜索-树形数据处理const searchTree = (tree: any[], keyword: string, includeChildren: boolean = false) => {const newTree = [] as any;for (let i = 0; i < tree.length; i++) {const node = tree[i];if (node[labelKey.value]?.includes(keyword)) {// 如果当前节点符合条件,则将其复制到新的树形结构中,并根据 includeChildren 参数决定是否将其所有子节点也复制到新的树形结构中newTree.push({...node,children: includeChildren ? searchTree(node.children || [], '', true) : [],});} else if (node.children) {// 如果当前节点不符合条件且存在子节点,则递归遍历子节点,以继续搜索const result = searchTree(node.children, keyword, true);if (result.length > 0) {// 如果子节点中存在符合条件的节点,则将其复制到新的树形结构中newTree.push({ ...node, children: result });}}}return newTree;};// 点击树节点const checkNode = (item: any, checked?: boolean) => {emit('click', item); // 点击事件if (!props.checkable) return;const isCheckable = !!props.treeProp?.checkFn?.(item);if (!isCheckable) return;if (typeof checked !== 'undefined') {item._checked = checked;} else {if (typeof item._checked === 'undefined') {item._checked = false;}item._checked = !item._checked;}const checkIndex = checkList.value.findIndex((it: any) => it[idKey.value] === item[idKey.value],);if (checkIndex === -1 && item._checked) {checkList.value.push(item);}if (checkIndex !== -1 && !item._checked) {checkList.value.splice(checkIndex, 1);}emit('check', checkList.value);};// 清空选中const clearCheck = () => {checkList.value.forEach((item: any) => {item._checked = false;});checkList.value = [];emit('check', checkList.value, null);};// 根据id查找树结点const getNodeById = (treeNodes: any[], id: string): any => {for (let node of treeNodes) {if (node[idKey.value] === id) return node;else if (node.children?.length) {const result2 = getNodeById(node.children, id);if (result2) {return result2;}}}return null;};const checkNodeByKey = (id: string, checked: boolean) => {const item = getNodeById(props.data, id);if (!item) return;checkNode(item, checked);};
</script><style lang="scss" scoped>.tree-panel .tree-box {height: calc(100% - 56px - 4px); //uniapp内部写死overflow: auto;}
</style>

tree-node.vue

<template><view class="tree-node-box"><viewv-for="(item, index) in props.data":key="index"class="tree-node-level":class="{ 'is-expanded': item._expanded }"><viewclass="tree-node-item"@click="clickNode(item)":class="['level-' + level, { 'is-checked': item._checked }]"><view class="tree-node-item__block" :style="{ width: `${(level - 1) * 48}rpx` }"></view><viewv-if="item.children && item.children.length"class="tree-node-item__expand-icon"@click.stop="handleOpenClose(item)"><sl-icon:name="item._expanded ? 'icon_arrow_expanded' : 'icon_arrow_folded'"color="primary":size="32"/></view><view v-else class="tree-node-item__space-icon"></view><view class="tree-node-item__content"><slot name="default" :node="item">{{ item[props.labelKey] }}</slot></view><sl-iconclass="tree-node-item__checked-icon"v-if="item._checked"color="primary"name="icon_check":size="36"/></view><!-- 使用组件本身渲染子项 --><template v-if="item.children && item.children.length"><tree-nodev-show="item._expanded":data="item.children":labelKey="labelKey":idKey="idKey":level="level + 1"@click="clickNode"><template #default="{ node }"><slot :node="node">{{ node[props.labelKey] }}</slot></template></tree-node></template></view></view>
</template><script setup lang="ts">import TreeNode from './tree-node.vue'; // 引入当前组件export interface Props {data: any;labelKey: string;idKey: string;level?: number;}const props = withDefaults(defineProps<Props>(), {data: [],level: 1,});const emit = defineEmits<{(e: 'click', item: any): void;}>();// 选中function clickNode(item: any) {emit('click', item);}// 处理展开或收起,item, indexfunction handleOpenClose(item: any) {// 如果不存在_expanded属性就添加该属性。if (typeof item._expanded === 'undefined') {item._expanded = false;}item._expanded = !item._expanded;}
</script><style scoped lang="scss">.tree-node-box {background: $ui-bg-page-white;}.tree-node-level {position: relative;// &.is-expanded{//   background: $ui-bg-page-white;// }}.tree-node-item {display: flex;align-items: center;padding: $ui-gap-xs $ui-gap-d $ui-gap-xs 0;box-sizing: border-box;font-size: 28rpx;&.level-1,&.level-2 {font-size: 32rpx;}&:not(:last-child) {border-bottom: 1rpx solid $ui-color-line-deep;}&.is-checked {background: $ui-color-primary-hover;color: $uni-primary;}}.tree-node-item__expand-icon {color: $uni-info;width: 56rpx;height: 56rpx;line-height: 56rpx;text-align: center;}.tree-node-item__space-icon {width: 10rpx;height: 56rpx;line-height: 56rpx;}.tree-node-item__block,.tree-node-item__expand-icon,.tree-node-item__space-icon{flex-shrink: 0;flex-grow: 0;}.tree-node-item__checked-icon {color: $uni-primary !important;}.tree-node-item__content {width: 80%;flex: 1;overflow: hidden;}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/816749.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode 721. 账户合并

1.题目基本信息 1.1.题目描述 给定一个列表 accounts,每个元素 accounts[i] 是一个字符串列表,其中第一个元素 accounts[i][0] 是 名称 (name),其余元素是 emails 表示该账户的邮箱地址。 现在,我们想合并这些账户。如果两个账户都有一些共同的邮箱地址,则两个账户必定属于…

网管平台(基础篇):网管系统的重要性

网管系统的核心地位:数字世界的稳定舵手 在信息技术日新月异的今天,网络如同一条无形的纽带,将世界紧密相连。然而,这条纽带背后隐藏着无数复杂的节点与链路,如何确保它们高效、稳定地运行,成为了一个亟待解决的问题。网管系统,作为数字世界的稳定舵手,以其强大的监控与…

揭秘!如何设计高可用、高性能、高扩展的异地多活系统?【转】

1 关于基础架构 2 关于异地多活 3 写时延是关键 4 写量大拆分片 5 做隔离拆分片 6 其他影响因素 7 数据复制架构 8 数据影响路由 9 架构选型模式异地多活是分布式系统架构设计的一座高峰,当业务系统走到需要考虑异地多活这一步,其体量和复杂度都会达到很高的水准。接入层、逻…

引擎模块自身占用

引擎自身中存在内存开销的部分纷繁复杂,可以说是由巨量的“微小”内存所累积起来的,比如GameObject及其各种Component(最大量的Component应该算是Transform了)、ParticleSystem、MonoScript以及各种各样的模块Manager(SceneManager、CanvasManager、PersistentManager等)……

怎样修改网站ftp密码?

修改网站FTP密码的方法取决于你使用的FTP服务提供商或Web主机控制面板。以下是一些常见情况下的步骤:通过cPanel修改FTP密码:登录到你的cPanel账户。 在文件部分找到“FTP账户”选项并点击。 选择你想要修改密码的FTP账户。 点击“更改密码”按钮。 输入新密码,并确认。 点击…

CMDB平台(基础篇):CMDB的概念以及现状

CMDB:IT界的“超级大脑”,现状却让人哭笑不得 在IT界,有一个神秘而强大的存在,它被称为CMDB——资产配置管理。听起来就像是《复仇者联盟》里的超级英雄,但实际上,它更像是IT界的“超级大脑”,默默记录着每一个IT组件的“身世”和“关系网”。 那CMDB到底是什么呢?下面…

网站如何修改后台代码?模板网站怎么修改?

修改网站后台代码通常涉及以下几个步骤,具体操作可能会因网站的技术栈和架构而有所不同。以下是一般流程: 1. 备份现有代码重要:在进行任何修改之前,务必备份现有的代码和数据库。这可以在出现问题时帮助你快速恢复。2. 确定修改需求明确你需要对后台代码进行哪些具体的修改…

如何修改公司网站文案?网站修改后台资料?

修改公司网站文案时,可以遵循以下几个步骤来确保内容既专业又吸引人:明确目标:确定修改文案的目的。是为了提高转化率、增强品牌形象还是更新产品信息? 明确目标受众是谁,了解他们的需求和偏好。收集反馈:从客户、同事或行业专家那里收集关于现有文案的反馈。 分析网站访…

【Java】若以框架(ruoyi-master)——9.shiro安全框架

若依采用了Apache Shiro是Java的一个安全框架。Shiro可以帮助我们完成:认证、授权、加密、会话管理、与Web集成、缓存等。其不仅可以用在 JavaSE环境,也可以用在 JavaEE 环境。 之前,为了了解shiro,我做了一些入门: 【shiro】1.快速入门 【shiro】2.认证、授权、源码分析 …

Flutter进阶(2):国际化开发

在全球化趋势下,应用支持多语言是非常重要的。Flutter 提供了强大的国际化(i18n)支持,可以通过 flutter_localizations 与 gen-l10n 工具生成的本地化类来实现不同区域和语言的适配。本篇博客将介绍如何在 Flutter 项目中使用 flutter_localizations,并实现多语言支持与动…

网站后台如何修改网页?公司网站修改怎么做?

要修改网站后台中的网页,通常涉及以下几个步骤:登录后台管理系统:使用管理员账号和密码登录到网站的后台管理系统。导航至页面管理:在后台管理系统中找到“页面管理”、“内容管理”或类似名称的模块。选择要编辑的页面:在页面列表中找到你需要修改的页面,点击编辑按钮。…

基于 Python + Vue3!一个轻量级的域名和 SSL 证书监测平台!

Domain Admin —— 一个基于 Python + Vue3.js 技术栈实现的域名和 SSL 证书监测平台。大家好,我是 Java陈序员。 在企业开发中,由于业务众多,涉及到很多业务域名证书,证书过期由于遗忘常常未能及时续期,导致线上访问异常,给企业带来损失! 今天,给大家介绍一个轻量级的…