HarmonyOS开发实战:UI封装、Cell组件封装规范

164 篇文章 0 订阅
154 篇文章 0 订阅

简介

鸿蒙基本库封装,提升鸿蒙开发效率

安装
ohpm install @peakmain/library
使用
二、Cell 单元格的使用

                                   

导入依赖

import {CellItemComponent, GroupCellComponent } from '@peakmain/library/Index'

布局使用,单个单元格,可直接使用CellItemComponent组件 示例代码如下

  let settingData=new CellBean()
  @Builder
  CellItemBuilder(item: CellBean) {
    CellItemComponent({
            cellBean: item
         })
      }
    })
  }
  
 builder(){
    this.CellItemBuilder(this.settingData)
 }

接下来只需要定义CellBean实体类即可

1. 基本使用

设置文本

settingData.cellName = "会员信息"

设置描述信息

 settingData.cellDesc = "会员信息、头像、昵称"

示例代码如下:

 let settingData = new CellBean()
 settingData.cellName = "会员信息"
 settingData.cellDesc = "会员信息、头像、昵称"
2. 隐藏右边箭头,展示右边文本

隐藏箭头方法

settingData.isArrow = false

显示右边文本

settingData.rightText = "去开启"//显示右边箭头

示例代码如下:

let settingData = new CellBean()
settingData.cellName = "您已关闭新消息通知"
settingData.cellDesc = "可能会错过订单信息、优惠活动等"
settingData.rightText = "去开启"//显示右边箭头
settingData.isArrow = false
settingData.itemClick=()=>{
 promptAction.showToast({
   message:"点击了消息通知"
 })
}
settingData.rightClick=()=>{
  promptAction.showToast({
    message:"去开启"
})
3. 隐藏右边箭头,展示右边文本,并修改右边文本字体颜色
  • 隐藏右边箭头,展示右边文本,参考第2个用法
  • 修改右边字体颜色
settingData.rightTextColor = $r("app.color.color_A9AAAA")

示例代码如下

let settingData = new CellBean()
settingData.cellName = "关于BasicLibrary"
settingData.rightText = ""
settingData.rightTextColor = $r("app.color.color_A9AAAA")
settingData.isArrow = true
4. 动态修改数据,如动态获取版本号
  aboutToAppear(): void {
    AppManager.getAppVersionNameSync().then((result) => {
      let settingData = new CellBean()
      settingData.cellName = "关于BasicLibrary"
      settingData.rightText = result
      settingData.rightTextColor = $r("app.color.color_A9AAAA")
      settingData.isArrow = true
      let index = this.groupCellArray.findIndex((item) => item.title == "")
      this.groupCellArray[index].cellBeanArray[0] = settingData
    })
  }

注:ArkTS所有内容都不支持深层数据更新 UI渲染

想要更新更深层次的嵌套数据, 方案如下

  1. 直接给第二层的属性赋值,此时不更新,直接将第一层对象,重新new一下重新赋值
  2. 更新第二层的数据之前,捎带手更新一下第一层的数据

最后

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?但是又不知道从哪里下手,而且学习时频繁踩坑,最终浪费大量时间。所以本人整理了一些比较合适的鸿蒙(HarmonyOS NEXT)学习路径和一些资料的整理供小伙伴学习

点击领取→纯血鸿蒙Next全套最新学习资料希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取~~

一、鸿蒙(HarmonyOS NEXT)最新学习路线

有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,内容包含:(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)…等技术知识点。

获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

二、HarmonyOS Next 最新全套视频教程

三、《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

四、大厂面试必问面试题

五、鸿蒙南向开发技术

六、鸿蒙APP开发必备


完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料

总结
总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。 

                        

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以参考下面的代码,这是一个基于Vue 2.0和Element UI的表格和搜索条件的公共组件: ```vue <template> <div> <el-form v-if="showFilter" :inline="true" :model="filterForm" class="demo-form-inline"> <el-form-item v-for="item in filterItems" :label="item.label" :key="item.prop"> <el-input v-if="item.type === 'input'" v-model="filterForm[item.prop]" :placeholder="item.placeholder"></el-input> <el-select v-if="item.type === 'select'" v-model="filterForm[item.prop]" :placeholder="item.placeholder"> <el-option v-for="option in item.options" :key="option.value" :label="option.label" :value="option.value"></el-option> </el-select> </el-form-item> <el-form-item> <el-button type="primary" @click="filter">查询</el-button> <el-button @click="resetFilter">重置</el-button> </el-form-item> </el-form> <el-table :data="tableData" :columns="tableColumns" :highlight-current-row="highlightCurrentRow" :row-class-name="rowClassName" :row-style="rowStyle" :row-key="rowKey" :header-cell-style="headerCellStyle" :default-sort="defaultSort" :show-header="showHeader" :show-summary="showSummary" :sum-text="sumText" :summary-method="summaryMethod" :border="border" :stripe="stripe" :size="size" :fit="fit" :empty-text="emptyText" :loading="loading" :row-selection="rowSelection" :expand-row-keys="expandRowKeys" :tree-props="treeProps" @row-click="rowClick" @row-dblclick="rowDblclick" @current-change="currentChange" @select="select" @select-all="selectAll" @selection-change="selectionChange" @cell-mouse-enter="cellMouseEnter" @cell-mouse-leave="cellMouseLeave" @cell-click="cellClick" @cell-dblclick="cellDblclick" @header-click="headerClick" @header-contextmenu="headerContextmenu" @sort-change="sortChange" @filter-change="filterChange" @expand-change="expandChange" @select-toggle-all="selectToggleAll" @select-toggle-row="selectToggleRow" @row-contextmenu="rowContextmenu" @header-dragend="headerDragend" @row-dragend="rowDragend" @row-dragenter="rowDragenter" @row-dragleave="rowDragleave" @row-dragover="rowDragover" @row-drop="rowDrop" ref="table"> <slot></slot> </el-table> <div v-if="showPagination" class="demo-pagination"> <el-pagination :page-size="pagination.pageSize" :total="pagination.total" :current-page.sync="pagination.currentPage" :page-sizes="[10, 20, 50, 100]" @size-change="handleSizeChange" @current-change="handleCurrentChange"></el-pagination> </div> </div> </template> <script> export default { name: 'TableWithFilter', props: { tableData: { type: Array, required: true }, tableColumns: { type: Array, required: true }, pagination: { type: Object, default: () => { return { pageSize: 10, total: 0, currentPage: 1 } } }, filterItems: { type: Array, default: () => [] }, showFilter: { type: Boolean, default: true }, showPagination: { type: Boolean, default: true }, highlightCurrentRow: Boolean, rowClassName: Function, rowStyle: [Object, Function], rowKey: [String, Function], headerCellStyle: [Object, Function], defaultSort: Object, showHeader: { type: Boolean, default: true }, showSummary: Boolean, sumText: String, summaryMethod: Function, border: Boolean, stripe: Boolean, size: String, fit: { type: Boolean, default: true }, emptyText: String, loading: Boolean, rowSelection: Object, expandRowKeys: Array, treeProps: Object }, data() { return { filterForm: {} } }, methods: { filter() { this.$refs.table.setCurrentRow(null) this.$emit('filter', this.filterForm) }, resetFilter() { this.filterForm = {} this.filter() }, handleSizeChange(val) { this.$emit('size-change', val) }, handleCurrentChange(val) { this.$emit('current-change', val) }, rowClick(row, column, event) { this.$emit('row-click', row, column, event) }, rowDblclick(row, event) { this.$emit('row-dblclick', row, event) }, currentChange(currentRow, oldCurrentRow) { this.$emit('current-change', currentRow, oldCurrentRow) }, select(selection, row) { this.$emit('select', selection, row) }, selectAll(selection) { this.$emit('select-all', selection) }, selectionChange(selection) { this.$emit('selection-change', selection) }, cellMouseEnter(row, column, cell, event) { this.$emit('cell-mouse-enter', row, column, cell, event) }, cellMouseLeave(row, column, cell, event) { this.$emit('cell-mouse-leave', row, column, cell, event) }, cellClick(row, column, cell, event) { this.$emit('cell-click', row, column, cell, event) }, cellDblclick(row, column, cell, event) { this.$emit('cell-dblclick', row, column, cell, event) }, headerClick(column, event) { this.$emit('header-click', column, event) }, headerContextmenu(column, event) { this.$emit('header-contextmenu', column, event) }, sortChange({ column, prop, order }) { this.$emit('sort-change', { column, prop, order }) }, filterChange(filters) { this.$emit('filter-change', filters) }, expandChange(row, expandedRows) { this.$emit('expand-change', row, expandedRows) }, selectToggleAll(selection) { this.$emit('select-toggle-all', selection) }, selectToggleRow(row, selected) { this.$emit('select-toggle-row', row, selected) }, rowContextmenu(row, event) { this.$emit('row-contextmenu', row, event) }, headerDragend(newWidth, oldWidth, column, event) { this.$emit('header-dragend', newWidth, oldWidth, column, event) }, rowDragend(newIndex, oldIndex, row, event) { this.$emit('row-dragend', newIndex, oldIndex, row, event) }, rowDragenter(dropPosition, drag, event) { this.$emit('row-dragenter', dropPosition, drag, event) }, rowDragleave(dropPosition, drag, event) { this.$emit('row-dragleave', dropPosition, drag, event) }, rowDragover(dropPosition, drag, event) { this.$emit('row-dragover', dropPosition, drag, event) }, rowDrop(dropPosition, drag, event) { this.$emit('row-drop', dropPosition, drag, event) } } } </script> <style scoped> .demo-form-inline .el-form-item { margin-right: 20px; } .demo-pagination { margin-top: 20px; text-align: right; } </style> ``` 使用方法: ```vue <template> <div> <table-with-filter :table-data="tableData" :table-columns="tableColumns" :pagination="pagination" :filter-items="filterItems"></table-with-filter> </div> </template> <script> import TableWithFilter from '@/components/TableWithFilter' export default { components: { TableWithFilter }, data() { return { tableData: [], tableColumns: [{ prop: 'name', label: '名称' }, { prop: 'age', label: '年龄' }], pagination: { pageSize: 10, total: 0, currentPage: 1 }, filterItems: [{ prop: 'name', label: '名称', placeholder: '请输入名称', type: 'input' }, { prop: 'age', label: '年龄', placeholder: '请选择年龄', type: 'select', options: [{ label: '18岁以下', value: '<=18' }, { label: '19-30岁', value: '19-30' }, { label: '31岁以上', value: '>=31' }] }] } }, methods: { fetchData() { // 获取数据并更新tableData和pagination.total }, handleFilter(params) { // 处理搜索条件 }, handleSizeChange(size) { this.pagination.pageSize = size this.fetchData() }, handleCurrentChange(page) { this.pagination.currentPage = page this.fetchData() } } } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值