diff --git a/.env b/.env index 7de40fe6..2985746e 100644 --- a/.env +++ b/.env @@ -1,32 +1,32 @@ -# 版本号 -SHOPRO_VERSION=v2.4.1 - -# 后端接口 - 正式环境(通过 process.env.NODE_ENV 非 development) -SHOPRO_BASE_URL=https://zjxshopapi.zianxin.com -# http://api-dashboard.yudao.iocoder.cn - -# 后端接口 - 测试环境(通过 process.env.NODE_ENV = development) -SHOPRO_DEV_BASE_URL=https://zjxshopapi.zianxin.com -### SHOPRO_DEV_BASE_URL = http://yunai.natapp1.cc - -# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持 S3 服务 -SHOPRO_UPLOAD_TYPE=server - -# 后端接口前缀(一般不建议调整) -SHOPRO_API_PATH=/app-api - -# 后端 websocket 接口前缀 -SHOPRO_WEBSOCKET_PATH=/infra/ws - -# 开发环境运行端口 -SHOPRO_DEV_PORT=3000 - -# 客户端静态资源地址 空=默认使用服务端指定的CDN资源地址前缀 | local=本地 | http(s)://xxx.xxx=自定义静态资源地址前缀 -### SHOPRO_STATIC_URL=http://test.yudao.iocoder.cn - SHOPRO_STATIC_URL = https://file.sheepjs.com - -# 是否开启直播 1 开启直播 | 0 关闭直播 (小程序官方后台未审核开通直播权限时请勿开启) -SHOPRO_MPLIVE_ON=0 - -# 租户ID 默认 1 -SHOPRO_TENANT_ID=1 +# 版本号 +SHOPRO_VERSION=v2.4.1 + +# 后端接口 - 正式环境(通过 process.env.NODE_ENV 非 development) +SHOPRO_BASE_URL=https://symy.asset-cloud.com.cn +# http://api-dashboard.yudao.iocoder.cn + +# 后端接口 - 测试环境(通过 process.env.NODE_ENV = development) +SHOPRO_DEV_BASE_URL=https://symy.asset-cloud.com.cn +### SHOPRO_DEV_BASE_URL = http://yunai.natapp1.cc + +# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持 S3 服务 +SHOPRO_UPLOAD_TYPE=server + +# 后端接口前缀(一般不建议调整) +SHOPRO_API_PATH=/app-api + +# 后端 websocket 接口前缀 +SHOPRO_WEBSOCKET_PATH=/infra/ws + +# 开发环境运行端口 +SHOPRO_DEV_PORT=3000 + +# 客户端静态资源地址 空=默认使用服务端指定的CDN资源地址前缀 | local=本地 | http(s)://xxx.xxx=自定义静态资源地址前缀 +### SHOPRO_STATIC_URL=http://test.yudao.iocoder.cn + SHOPRO_STATIC_URL = https://file.sheepjs.com + +# 是否开启直播 1 开启直播 | 0 关闭直播 (小程序官方后台未审核开通直播权限时请勿开启) +SHOPRO_MPLIVE_ON=0 + +# 租户ID 默认 1 +SHOPRO_TENANT_ID=1 diff --git a/uni_modules/uni-forms/changelog.md b/uni_modules/uni-forms/changelog.md index 26e120b5..a007da69 100644 --- a/uni_modules/uni-forms/changelog.md +++ b/uni_modules/uni-forms/changelog.md @@ -1,60 +1,60 @@ -## 1.3.2(2021-12-09) -- -## 1.3.1(2021-11-19) -- 修复 label 插槽不生效的bug -## 1.3.0(2021-11-19) -- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) -- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-forms](https://uniapp.dcloud.io/component/uniui/uni-forms) -## 1.2.7(2021-08-13) -- 修复 没有添加校验规则的字段依然报错的Bug -## 1.2.6(2021-08-11) -- 修复 重置表单错误信息无法清除的问题 -## 1.2.5(2021-08-11) -- 优化 组件文档 -## 1.2.4(2021-08-11) -- 修复 表单验证只生效一次的问题 -## 1.2.3(2021-07-30) -- 优化 vue3下事件警告的问题 -## 1.2.2(2021-07-26) -- 修复 vue2 下条件编译导致destroyed生命周期失效的Bug -- 修复 1.2.1 引起的示例在小程序平台报错的Bug -## 1.2.1(2021-07-22) -- 修复 动态校验表单,默认值为空的情况下校验失效的Bug -- 修复 不指定name属性时,运行报错的Bug -- 优化 label默认宽度从65调整至70,使required为true且四字时不换行 -- 优化 组件示例,新增动态校验示例代码 -- 优化 组件文档,使用方式更清晰 -## 1.2.0(2021-07-13) -- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -## 1.1.2(2021-06-25) -- 修复 pattern 属性在微信小程序平台无效的问题 -## 1.1.1(2021-06-22) -- 修复 validate-trigger属性为submit且err-show-type属性为toast时不能弹出的Bug -## 1.1.0(2021-06-22) -- 修复 只写setRules方法而导致校验不生效的Bug -- 修复 由上个办法引发的错误提示文字错位的Bug -## 1.0.48(2021-06-21) -- 修复 不设置 label 属性 ,无法设置label插槽的问题 -## 1.0.47(2021-06-21) -- 修复 不设置label属性,label-width属性不生效的bug -- 修复 setRules 方法与rules属性冲突的问题 -## 1.0.46(2021-06-04) -- 修复 动态删减数据导致报错的问题 -## 1.0.45(2021-06-04) -- 新增 modelValue 属性 ,value 即将废弃 -## 1.0.44(2021-06-02) -- 新增 uni-forms-item 可以设置单独的 rules -- 新增 validate 事件增加 keepitem 参数,可以选择那些字段不过滤 -- 优化 submit 事件重命名为 validate -## 1.0.43(2021-05-12) -- 新增 组件示例地址 -## 1.0.42(2021-04-30) -- 修复 自定义检验器失效的问题 -## 1.0.41(2021-03-05) -- 更新 校验器 -- 修复 表单规则设置类型为 number 的情况下,值为0校验失败的Bug -## 1.0.40(2021-03-04) -- 修复 动态显示uni-forms-item的情况下,submit 方法获取值错误的Bug -## 1.0.39(2021-02-05) -- 调整为uni_modules目录规范 -- 修复 校验器传入 int 等类型 ,返回String类型的Bug +## 1.3.2(2021-12-09) +- +## 1.3.1(2021-11-19) +- 修复 label 插槽不生效的bug +## 1.3.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-forms](https://uniapp.dcloud.io/component/uniui/uni-forms) +## 1.2.7(2021-08-13) +- 修复 没有添加校验规则的字段依然报错的Bug +## 1.2.6(2021-08-11) +- 修复 重置表单错误信息无法清除的问题 +## 1.2.5(2021-08-11) +- 优化 组件文档 +## 1.2.4(2021-08-11) +- 修复 表单验证只生效一次的问题 +## 1.2.3(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.2.2(2021-07-26) +- 修复 vue2 下条件编译导致destroyed生命周期失效的Bug +- 修复 1.2.1 引起的示例在小程序平台报错的Bug +## 1.2.1(2021-07-22) +- 修复 动态校验表单,默认值为空的情况下校验失效的Bug +- 修复 不指定name属性时,运行报错的Bug +- 优化 label默认宽度从65调整至70,使required为true且四字时不换行 +- 优化 组件示例,新增动态校验示例代码 +- 优化 组件文档,使用方式更清晰 +## 1.2.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.2(2021-06-25) +- 修复 pattern 属性在微信小程序平台无效的问题 +## 1.1.1(2021-06-22) +- 修复 validate-trigger属性为submit且err-show-type属性为toast时不能弹出的Bug +## 1.1.0(2021-06-22) +- 修复 只写setRules方法而导致校验不生效的Bug +- 修复 由上个办法引发的错误提示文字错位的Bug +## 1.0.48(2021-06-21) +- 修复 不设置 label 属性 ,无法设置label插槽的问题 +## 1.0.47(2021-06-21) +- 修复 不设置label属性,label-width属性不生效的bug +- 修复 setRules 方法与rules属性冲突的问题 +## 1.0.46(2021-06-04) +- 修复 动态删减数据导致报错的问题 +## 1.0.45(2021-06-04) +- 新增 modelValue 属性 ,value 即将废弃 +## 1.0.44(2021-06-02) +- 新增 uni-forms-item 可以设置单独的 rules +- 新增 validate 事件增加 keepitem 参数,可以选择那些字段不过滤 +- 优化 submit 事件重命名为 validate +## 1.0.43(2021-05-12) +- 新增 组件示例地址 +## 1.0.42(2021-04-30) +- 修复 自定义检验器失效的问题 +## 1.0.41(2021-03-05) +- 更新 校验器 +- 修复 表单规则设置类型为 number 的情况下,值为0校验失败的Bug +## 1.0.40(2021-03-04) +- 修复 动态显示uni-forms-item的情况下,submit 方法获取值错误的Bug +## 1.0.39(2021-02-05) +- 调整为uni_modules目录规范 +- 修复 校验器传入 int 等类型 ,返回String类型的Bug diff --git a/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue b/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue index 184122a9..faea081a 100644 --- a/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue +++ b/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue @@ -1,536 +1,536 @@ - - - - - + + + + + diff --git a/uni_modules/uni-forms/components/uni-forms/uni-forms.vue b/uni_modules/uni-forms/components/uni-forms/uni-forms.vue index d8b4e66b..dff823bb 100644 --- a/uni_modules/uni-forms/components/uni-forms/uni-forms.vue +++ b/uni_modules/uni-forms/components/uni-forms/uni-forms.vue @@ -1,472 +1,472 @@ - - - - - + + + + + diff --git a/uni_modules/uni-forms/components/uni-forms/validate.js b/uni_modules/uni-forms/components/uni-forms/validate.js index 1834c6cf..e631fb23 100644 --- a/uni_modules/uni-forms/components/uni-forms/validate.js +++ b/uni_modules/uni-forms/components/uni-forms/validate.js @@ -1,486 +1,486 @@ -var pattern = { - email: /^\S+?@\S+?\.\S+?$/, - idcard: /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/, - url: new RegExp( - "^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$", - 'i') -}; - -const FORMAT_MAPPING = { - "int": 'integer', - "bool": 'boolean', - "double": 'number', - "long": 'number', - "password": 'string' - // "fileurls": 'array' -} - -function formatMessage(args, resources = '') { - var defaultMessage = ['label'] - defaultMessage.forEach((item) => { - if (args[item] === undefined) { - args[item] = '' - } - }) - - let str = resources - for (let key in args) { - let reg = new RegExp('{' + key + '}') - str = str.replace(reg, args[key]) - } - return str -} - -function isEmptyValue(value, type) { - if (value === undefined || value === null) { - return true; - } - - if (typeof value === 'string' && !value) { - return true; - } - - if (Array.isArray(value) && !value.length) { - return true; - } - - if (type === 'object' && !Object.keys(value).length) { - return true; - } - - return false; -} - -const types = { - integer(value) { - return types.number(value) && parseInt(value, 10) === value; - }, - string(value) { - return typeof value === 'string'; - }, - number(value) { - if (isNaN(value)) { - return false; - } - return typeof value === 'number'; - }, - "boolean": function(value) { - return typeof value === 'boolean'; - }, - "float": function(value) { - return types.number(value) && !types.integer(value); - }, - array(value) { - return Array.isArray(value); - }, - object(value) { - return typeof value === 'object' && !types.array(value); - }, - date(value) { - return value instanceof Date; - }, - timestamp(value) { - if (!this.integer(value) || Math.abs(value).toString().length > 16) { - return false - } - return true; - }, - file(value) { - return typeof value.url === 'string'; - }, - email(value) { - return typeof value === 'string' && !!value.match(pattern.email) && value.length < 255; - }, - url(value) { - return typeof value === 'string' && !!value.match(pattern.url); - }, - pattern(reg, value) { - try { - return new RegExp(reg).test(value); - } catch (e) { - return false; - } - }, - method(value) { - return typeof value === 'function'; - }, - idcard(value) { - return typeof value === 'string' && !!value.match(pattern.idcard); - }, - 'url-https'(value) { - return this.url(value) && value.startsWith('https://'); - }, - 'url-scheme'(value) { - return value.startsWith('://'); - }, - 'url-web'(value) { - return false; - } -} - -class RuleValidator { - - constructor(message) { - this._message = message - } - - async validateRule(fieldKey, fieldValue, value, data, allData) { - var result = null - - let rules = fieldValue.rules - - let hasRequired = rules.findIndex((item) => { - return item.required - }) - if (hasRequired < 0) { - if (value === null || value === undefined) { - return result - } - if (typeof value === 'string' && !value.length) { - return result - } - } - - var message = this._message - - if (rules === undefined) { - return message['default'] - } - - for (var i = 0; i < rules.length; i++) { - let rule = rules[i] - let vt = this._getValidateType(rule) - - Object.assign(rule, { - label: fieldValue.label || `["${fieldKey}"]` - }) - - if (RuleValidatorHelper[vt]) { - result = RuleValidatorHelper[vt](rule, value, message) - if (result != null) { - break - } - } - - if (rule.validateExpr) { - let now = Date.now() - let resultExpr = rule.validateExpr(value, allData, now) - if (resultExpr === false) { - result = this._getMessage(rule, rule.errorMessage || this._message['default']) - break - } - } - - if (rule.validateFunction) { - result = await this.validateFunction(rule, value, data, allData, vt) - if (result !== null) { - break - } - } - } - - if (result !== null) { - result = message.TAG + result - } - - return result - } - - async validateFunction(rule, value, data, allData, vt) { - let result = null - try { - let callbackMessage = null - const res = await rule.validateFunction(rule, value, allData || data, (message) => { - callbackMessage = message - }) - if (callbackMessage || (typeof res === 'string' && res) || res === false) { - result = this._getMessage(rule, callbackMessage || res, vt) - } - } catch (e) { - result = this._getMessage(rule, e.message, vt) - } - return result - } - - _getMessage(rule, message, vt) { - return formatMessage(rule, message || rule.errorMessage || this._message[vt] || message['default']) - } - - _getValidateType(rule) { - var result = '' - if (rule.required) { - result = 'required' - } else if (rule.format) { - result = 'format' - } else if (rule.arrayType) { - result = 'arrayTypeFormat' - } else if (rule.range) { - result = 'range' - } else if (rule.maximum !== undefined || rule.minimum !== undefined) { - result = 'rangeNumber' - } else if (rule.maxLength !== undefined || rule.minLength !== undefined) { - result = 'rangeLength' - } else if (rule.pattern) { - result = 'pattern' - } else if (rule.validateFunction) { - result = 'validateFunction' - } - return result - } -} - -const RuleValidatorHelper = { - required(rule, value, message) { - if (rule.required && isEmptyValue(value, rule.format || typeof value)) { - return formatMessage(rule, rule.errorMessage || message.required); - } - - return null - }, - - range(rule, value, message) { - const { - range, - errorMessage - } = rule; - - let list = new Array(range.length); - for (let i = 0; i < range.length; i++) { - const item = range[i]; - if (types.object(item) && item.value !== undefined) { - list[i] = item.value; - } else { - list[i] = item; - } - } - - let result = false - if (Array.isArray(value)) { - result = (new Set(value.concat(list)).size === list.length); - } else { - if (list.indexOf(value) > -1) { - result = true; - } - } - - if (!result) { - return formatMessage(rule, errorMessage || message['enum']); - } - - return null - }, - - rangeNumber(rule, value, message) { - if (!types.number(value)) { - return formatMessage(rule, rule.errorMessage || message.pattern.mismatch); - } - - let { - minimum, - maximum, - exclusiveMinimum, - exclusiveMaximum - } = rule; - let min = exclusiveMinimum ? value <= minimum : value < minimum; - let max = exclusiveMaximum ? value >= maximum : value > maximum; - - if (minimum !== undefined && min) { - return formatMessage(rule, rule.errorMessage || message['number'][exclusiveMinimum ? - 'exclusiveMinimum' : 'minimum' - ]) - } else if (maximum !== undefined && max) { - return formatMessage(rule, rule.errorMessage || message['number'][exclusiveMaximum ? - 'exclusiveMaximum' : 'maximum' - ]) - } else if (minimum !== undefined && maximum !== undefined && (min || max)) { - return formatMessage(rule, rule.errorMessage || message['number'].range) - } - - return null - }, - - rangeLength(rule, value, message) { - if (!types.string(value) && !types.array(value)) { - return formatMessage(rule, rule.errorMessage || message.pattern.mismatch); - } - - let min = rule.minLength; - let max = rule.maxLength; - let val = value.length; - - if (min !== undefined && val < min) { - return formatMessage(rule, rule.errorMessage || message['length'].minLength) - } else if (max !== undefined && val > max) { - return formatMessage(rule, rule.errorMessage || message['length'].maxLength) - } else if (min !== undefined && max !== undefined && (val < min || val > max)) { - return formatMessage(rule, rule.errorMessage || message['length'].range) - } - - return null - }, - - pattern(rule, value, message) { - if (!types['pattern'](rule.pattern, value)) { - return formatMessage(rule, rule.errorMessage || message.pattern.mismatch); - } - - return null - }, - - format(rule, value, message) { - var customTypes = Object.keys(types); - var format = FORMAT_MAPPING[rule.format] ? FORMAT_MAPPING[rule.format] : (rule.format || rule.arrayType); - - if (customTypes.indexOf(format) > -1) { - if (!types[format](value)) { - return formatMessage(rule, rule.errorMessage || message.typeError); - } - } - - return null - }, - - arrayTypeFormat(rule, value, message) { - if (!Array.isArray(value)) { - return formatMessage(rule, rule.errorMessage || message.typeError); - } - - for (let i = 0; i < value.length; i++) { - const element = value[i]; - let formatResult = this.format(rule, element, message) - if (formatResult !== null) { - return formatResult - } - } - - return null - } -} - -class SchemaValidator extends RuleValidator { - - constructor(schema, options) { - super(SchemaValidator.message); - - this._schema = schema - this._options = options || null - } - - updateSchema(schema) { - this._schema = schema - } - - async validate(data, allData) { - let result = this._checkFieldInSchema(data) - if (!result) { - result = await this.invokeValidate(data, false, allData) - } - return result.length ? result[0] : null - } - - async validateAll(data, allData) { - let result = this._checkFieldInSchema(data) - if (!result) { - result = await this.invokeValidate(data, true, allData) - } - return result - } - - async validateUpdate(data, allData) { - let result = this._checkFieldInSchema(data) - if (!result) { - result = await this.invokeValidateUpdate(data, false, allData) - } - return result.length ? result[0] : null - } - - async invokeValidate(data, all, allData) { - let result = [] - let schema = this._schema - for (let key in schema) { - let value = schema[key] - let errorMessage = await this.validateRule(key, value, data[key], data, allData) - if (errorMessage != null) { - result.push({ - key, - errorMessage - }) - if (!all) break - } - } - return result - } - - async invokeValidateUpdate(data, all, allData) { - let result = [] - for (let key in data) { - let errorMessage = await this.validateRule(key, this._schema[key], data[key], data, allData) - if (errorMessage != null) { - result.push({ - key, - errorMessage - }) - if (!all) break - } - } - return result - } - - _checkFieldInSchema(data) { - var keys = Object.keys(data) - var keys2 = Object.keys(this._schema) - if (new Set(keys.concat(keys2)).size === keys2.length) { - return '' - } - - var noExistFields = keys.filter((key) => { - return keys2.indexOf(key) < 0; - }) - var errorMessage = formatMessage({ - field: JSON.stringify(noExistFields) - }, SchemaValidator.message.TAG + SchemaValidator.message['defaultInvalid']) - return [{ - key: 'invalid', - errorMessage - }] - } -} - -function Message() { - return { - TAG: "", - default: '验证错误', - defaultInvalid: '提交的字段{field}在数据库中并不存在', - validateFunction: '验证无效', - required: '{label}必填', - 'enum': '{label}超出范围', - timestamp: '{label}格式无效', - whitespace: '{label}不能为空', - typeError: '{label}类型无效', - date: { - format: '{label}日期{value}格式无效', - parse: '{label}日期无法解析,{value}无效', - invalid: '{label}日期{value}无效' - }, - length: { - minLength: '{label}长度不能少于{minLength}', - maxLength: '{label}长度不能超过{maxLength}', - range: '{label}必须介于{minLength}和{maxLength}之间' - }, - number: { - minimum: '{label}不能小于{minimum}', - maximum: '{label}不能大于{maximum}', - exclusiveMinimum: '{label}不能小于等于{minimum}', - exclusiveMaximum: '{label}不能大于等于{maximum}', - range: '{label}必须介于{minimum}and{maximum}之间' - }, - pattern: { - mismatch: '{label}格式不匹配' - } - }; -} - - -SchemaValidator.message = new Message(); - -export default SchemaValidator +var pattern = { + email: /^\S+?@\S+?\.\S+?$/, + idcard: /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/, + url: new RegExp( + "^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$", + 'i') +}; + +const FORMAT_MAPPING = { + "int": 'integer', + "bool": 'boolean', + "double": 'number', + "long": 'number', + "password": 'string' + // "fileurls": 'array' +} + +function formatMessage(args, resources = '') { + var defaultMessage = ['label'] + defaultMessage.forEach((item) => { + if (args[item] === undefined) { + args[item] = '' + } + }) + + let str = resources + for (let key in args) { + let reg = new RegExp('{' + key + '}') + str = str.replace(reg, args[key]) + } + return str +} + +function isEmptyValue(value, type) { + if (value === undefined || value === null) { + return true; + } + + if (typeof value === 'string' && !value) { + return true; + } + + if (Array.isArray(value) && !value.length) { + return true; + } + + if (type === 'object' && !Object.keys(value).length) { + return true; + } + + return false; +} + +const types = { + integer(value) { + return types.number(value) && parseInt(value, 10) === value; + }, + string(value) { + return typeof value === 'string'; + }, + number(value) { + if (isNaN(value)) { + return false; + } + return typeof value === 'number'; + }, + "boolean": function(value) { + return typeof value === 'boolean'; + }, + "float": function(value) { + return types.number(value) && !types.integer(value); + }, + array(value) { + return Array.isArray(value); + }, + object(value) { + return typeof value === 'object' && !types.array(value); + }, + date(value) { + return value instanceof Date; + }, + timestamp(value) { + if (!this.integer(value) || Math.abs(value).toString().length > 16) { + return false + } + return true; + }, + file(value) { + return typeof value.url === 'string'; + }, + email(value) { + return typeof value === 'string' && !!value.match(pattern.email) && value.length < 255; + }, + url(value) { + return typeof value === 'string' && !!value.match(pattern.url); + }, + pattern(reg, value) { + try { + return new RegExp(reg).test(value); + } catch (e) { + return false; + } + }, + method(value) { + return typeof value === 'function'; + }, + idcard(value) { + return typeof value === 'string' && !!value.match(pattern.idcard); + }, + 'url-https'(value) { + return this.url(value) && value.startsWith('https://'); + }, + 'url-scheme'(value) { + return value.startsWith('://'); + }, + 'url-web'(value) { + return false; + } +} + +class RuleValidator { + + constructor(message) { + this._message = message + } + + async validateRule(fieldKey, fieldValue, value, data, allData) { + var result = null + + let rules = fieldValue.rules + + let hasRequired = rules.findIndex((item) => { + return item.required + }) + if (hasRequired < 0) { + if (value === null || value === undefined) { + return result + } + if (typeof value === 'string' && !value.length) { + return result + } + } + + var message = this._message + + if (rules === undefined) { + return message['default'] + } + + for (var i = 0; i < rules.length; i++) { + let rule = rules[i] + let vt = this._getValidateType(rule) + + Object.assign(rule, { + label: fieldValue.label || `["${fieldKey}"]` + }) + + if (RuleValidatorHelper[vt]) { + result = RuleValidatorHelper[vt](rule, value, message) + if (result != null) { + break + } + } + + if (rule.validateExpr) { + let now = Date.now() + let resultExpr = rule.validateExpr(value, allData, now) + if (resultExpr === false) { + result = this._getMessage(rule, rule.errorMessage || this._message['default']) + break + } + } + + if (rule.validateFunction) { + result = await this.validateFunction(rule, value, data, allData, vt) + if (result !== null) { + break + } + } + } + + if (result !== null) { + result = message.TAG + result + } + + return result + } + + async validateFunction(rule, value, data, allData, vt) { + let result = null + try { + let callbackMessage = null + const res = await rule.validateFunction(rule, value, allData || data, (message) => { + callbackMessage = message + }) + if (callbackMessage || (typeof res === 'string' && res) || res === false) { + result = this._getMessage(rule, callbackMessage || res, vt) + } + } catch (e) { + result = this._getMessage(rule, e.message, vt) + } + return result + } + + _getMessage(rule, message, vt) { + return formatMessage(rule, message || rule.errorMessage || this._message[vt] || message['default']) + } + + _getValidateType(rule) { + var result = '' + if (rule.required) { + result = 'required' + } else if (rule.format) { + result = 'format' + } else if (rule.arrayType) { + result = 'arrayTypeFormat' + } else if (rule.range) { + result = 'range' + } else if (rule.maximum !== undefined || rule.minimum !== undefined) { + result = 'rangeNumber' + } else if (rule.maxLength !== undefined || rule.minLength !== undefined) { + result = 'rangeLength' + } else if (rule.pattern) { + result = 'pattern' + } else if (rule.validateFunction) { + result = 'validateFunction' + } + return result + } +} + +const RuleValidatorHelper = { + required(rule, value, message) { + if (rule.required && isEmptyValue(value, rule.format || typeof value)) { + return formatMessage(rule, rule.errorMessage || message.required); + } + + return null + }, + + range(rule, value, message) { + const { + range, + errorMessage + } = rule; + + let list = new Array(range.length); + for (let i = 0; i < range.length; i++) { + const item = range[i]; + if (types.object(item) && item.value !== undefined) { + list[i] = item.value; + } else { + list[i] = item; + } + } + + let result = false + if (Array.isArray(value)) { + result = (new Set(value.concat(list)).size === list.length); + } else { + if (list.indexOf(value) > -1) { + result = true; + } + } + + if (!result) { + return formatMessage(rule, errorMessage || message['enum']); + } + + return null + }, + + rangeNumber(rule, value, message) { + if (!types.number(value)) { + return formatMessage(rule, rule.errorMessage || message.pattern.mismatch); + } + + let { + minimum, + maximum, + exclusiveMinimum, + exclusiveMaximum + } = rule; + let min = exclusiveMinimum ? value <= minimum : value < minimum; + let max = exclusiveMaximum ? value >= maximum : value > maximum; + + if (minimum !== undefined && min) { + return formatMessage(rule, rule.errorMessage || message['number'][exclusiveMinimum ? + 'exclusiveMinimum' : 'minimum' + ]) + } else if (maximum !== undefined && max) { + return formatMessage(rule, rule.errorMessage || message['number'][exclusiveMaximum ? + 'exclusiveMaximum' : 'maximum' + ]) + } else if (minimum !== undefined && maximum !== undefined && (min || max)) { + return formatMessage(rule, rule.errorMessage || message['number'].range) + } + + return null + }, + + rangeLength(rule, value, message) { + if (!types.string(value) && !types.array(value)) { + return formatMessage(rule, rule.errorMessage || message.pattern.mismatch); + } + + let min = rule.minLength; + let max = rule.maxLength; + let val = value.length; + + if (min !== undefined && val < min) { + return formatMessage(rule, rule.errorMessage || message['length'].minLength) + } else if (max !== undefined && val > max) { + return formatMessage(rule, rule.errorMessage || message['length'].maxLength) + } else if (min !== undefined && max !== undefined && (val < min || val > max)) { + return formatMessage(rule, rule.errorMessage || message['length'].range) + } + + return null + }, + + pattern(rule, value, message) { + if (!types['pattern'](rule.pattern, value)) { + return formatMessage(rule, rule.errorMessage || message.pattern.mismatch); + } + + return null + }, + + format(rule, value, message) { + var customTypes = Object.keys(types); + var format = FORMAT_MAPPING[rule.format] ? FORMAT_MAPPING[rule.format] : (rule.format || rule.arrayType); + + if (customTypes.indexOf(format) > -1) { + if (!types[format](value)) { + return formatMessage(rule, rule.errorMessage || message.typeError); + } + } + + return null + }, + + arrayTypeFormat(rule, value, message) { + if (!Array.isArray(value)) { + return formatMessage(rule, rule.errorMessage || message.typeError); + } + + for (let i = 0; i < value.length; i++) { + const element = value[i]; + let formatResult = this.format(rule, element, message) + if (formatResult !== null) { + return formatResult + } + } + + return null + } +} + +class SchemaValidator extends RuleValidator { + + constructor(schema, options) { + super(SchemaValidator.message); + + this._schema = schema + this._options = options || null + } + + updateSchema(schema) { + this._schema = schema + } + + async validate(data, allData) { + let result = this._checkFieldInSchema(data) + if (!result) { + result = await this.invokeValidate(data, false, allData) + } + return result.length ? result[0] : null + } + + async validateAll(data, allData) { + let result = this._checkFieldInSchema(data) + if (!result) { + result = await this.invokeValidate(data, true, allData) + } + return result + } + + async validateUpdate(data, allData) { + let result = this._checkFieldInSchema(data) + if (!result) { + result = await this.invokeValidateUpdate(data, false, allData) + } + return result.length ? result[0] : null + } + + async invokeValidate(data, all, allData) { + let result = [] + let schema = this._schema + for (let key in schema) { + let value = schema[key] + let errorMessage = await this.validateRule(key, value, data[key], data, allData) + if (errorMessage != null) { + result.push({ + key, + errorMessage + }) + if (!all) break + } + } + return result + } + + async invokeValidateUpdate(data, all, allData) { + let result = [] + for (let key in data) { + let errorMessage = await this.validateRule(key, this._schema[key], data[key], data, allData) + if (errorMessage != null) { + result.push({ + key, + errorMessage + }) + if (!all) break + } + } + return result + } + + _checkFieldInSchema(data) { + var keys = Object.keys(data) + var keys2 = Object.keys(this._schema) + if (new Set(keys.concat(keys2)).size === keys2.length) { + return '' + } + + var noExistFields = keys.filter((key) => { + return keys2.indexOf(key) < 0; + }) + var errorMessage = formatMessage({ + field: JSON.stringify(noExistFields) + }, SchemaValidator.message.TAG + SchemaValidator.message['defaultInvalid']) + return [{ + key: 'invalid', + errorMessage + }] + } +} + +function Message() { + return { + TAG: "", + default: '验证错误', + defaultInvalid: '提交的字段{field}在数据库中并不存在', + validateFunction: '验证无效', + required: '{label}必填', + 'enum': '{label}超出范围', + timestamp: '{label}格式无效', + whitespace: '{label}不能为空', + typeError: '{label}类型无效', + date: { + format: '{label}日期{value}格式无效', + parse: '{label}日期无法解析,{value}无效', + invalid: '{label}日期{value}无效' + }, + length: { + minLength: '{label}长度不能少于{minLength}', + maxLength: '{label}长度不能超过{maxLength}', + range: '{label}必须介于{minLength}和{maxLength}之间' + }, + number: { + minimum: '{label}不能小于{minimum}', + maximum: '{label}不能大于{maximum}', + exclusiveMinimum: '{label}不能小于等于{minimum}', + exclusiveMaximum: '{label}不能大于等于{maximum}', + range: '{label}必须介于{minimum}and{maximum}之间' + }, + pattern: { + mismatch: '{label}格式不匹配' + } + }; +} + + +SchemaValidator.message = new Message(); + +export default SchemaValidator diff --git a/uni_modules/uni-forms/package.json b/uni_modules/uni-forms/package.json index dfa7af4c..55e6838b 100644 --- a/uni_modules/uni-forms/package.json +++ b/uni_modules/uni-forms/package.json @@ -1,90 +1,90 @@ -{ - "id": "uni-forms", - "displayName": "uni-forms 表单", - "version": "1.3.2", - "description": "由输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据", - "keywords": [ - "uni-ui", - "表单", - "校验", - "表单校验", - "表单验证" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "" - }, - "directories": { - "example": "../../temps/example_temps" - }, - "dcloudext": { - "category": [ - "前端组件", - "通用组件" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" - }, - "uni_modules": { - "dependencies": [ - "uni-scss", - "uni-icons" - ], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "App": { - "app-vue": "y", - "app-nvue": "y" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" - }, - "快应用": { - "华为": "u", - "联盟": "u" - }, - "Vue": { - "vue2": "y", - "vue3": "y" - } - } - } - } -} +{ + "id": "uni-forms", + "displayName": "uni-forms 表单", + "version": "1.3.2", + "description": "由输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据", + "keywords": [ + "uni-ui", + "表单", + "校验", + "表单校验", + "表单验证" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-forms/readme.md b/uni_modules/uni-forms/readme.md index 63d5a043..5334701e 100644 --- a/uni_modules/uni-forms/readme.md +++ b/uni_modules/uni-forms/readme.md @@ -1,23 +1,23 @@ - - -## Forms 表单 - -> **组件名:uni-forms** -> 代码块: `uForms`、`uni-forms-item` -> 关联组件:`uni-forms-item`、`uni-easyinput`、`uni-data-checkbox`、`uni-group`。 - - -uni-app的内置组件已经有了 `
`组件,用于提交表单内容。 - -然而几乎每个表单都需要做表单验证,为了方便做表单验证,减少重复开发,`uni ui` 又基于 ``组件封装了 ``组件,内置了表单验证功能。 - -`` 提供了 `rules`属性来描述校验规则、``子组件来包裹具体的表单项,以及给原生或三方组件提供了 `binddata()` 来设置表单值。 - -每个要校验的表单项,不管input还是checkbox,都必须放在``组件中,且一个``组件只能放置一个表单项。 - -``组件内部预留了显示error message的区域,默认是在表单项的底部。 - -另外,``组件下面的各个表单项,可以通过``包裹为不同的分组。同一``下的不同表单项目将聚拢在一起,同其他group保持垂直间距。``仅影响视觉效果。 - -### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-forms) + + +## Forms 表单 + +> **组件名:uni-forms** +> 代码块: `uForms`、`uni-forms-item` +> 关联组件:`uni-forms-item`、`uni-easyinput`、`uni-data-checkbox`、`uni-group`。 + + +uni-app的内置组件已经有了 ``组件,用于提交表单内容。 + +然而几乎每个表单都需要做表单验证,为了方便做表单验证,减少重复开发,`uni ui` 又基于 ``组件封装了 ``组件,内置了表单验证功能。 + +`` 提供了 `rules`属性来描述校验规则、``子组件来包裹具体的表单项,以及给原生或三方组件提供了 `binddata()` 来设置表单值。 + +每个要校验的表单项,不管input还是checkbox,都必须放在``组件中,且一个``组件只能放置一个表单项。 + +``组件内部预留了显示error message的区域,默认是在表单项的底部。 + +另外,``组件下面的各个表单项,可以通过``包裹为不同的分组。同一``下的不同表单项目将聚拢在一起,同其他group保持垂直间距。``仅影响视觉效果。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-forms) #### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-goods-nav/changelog.md b/uni_modules/uni-goods-nav/changelog.md index c6264c67..c06a7786 100644 --- a/uni_modules/uni-goods-nav/changelog.md +++ b/uni_modules/uni-goods-nav/changelog.md @@ -1,18 +1,18 @@ -## 1.2.1(2022-05-30) -- 新增 stat属性,是否开启uni统计功能 -## 1.2.0(2021-11-19) -- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) -- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-goods-nav](https://uniapp.dcloud.io/component/uniui/uni-goods-nav) -## 1.1.1(2021-08-24) -- 新增 支持国际化 -## 1.1.0(2021-07-13) -- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -## 1.0.7(2021-05-12) -- 新增 组件示例地址 -## 1.0.6(2021-04-21) -- 优化 添加依赖 uni-icons, 导入后自动下载依赖 -## 1.0.5(2021-02-05) -- 优化 组件引用关系,通过uni_modules引用组件 - -## 1.0.4(2021-02-05) -- 调整为uni_modules目录规范 +## 1.2.1(2022-05-30) +- 新增 stat属性,是否开启uni统计功能 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-goods-nav](https://uniapp.dcloud.io/component/uniui/uni-goods-nav) +## 1.1.1(2021-08-24) +- 新增 支持国际化 +## 1.1.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.7(2021-05-12) +- 新增 组件示例地址 +## 1.0.6(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 1.0.5(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.4(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/en.json b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/en.json index dcdba41c..94f18684 100644 --- a/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/en.json +++ b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/en.json @@ -1,6 +1,6 @@ -{ - "uni-goods-nav.options.shop": "shop", - "uni-goods-nav.options.cart": "cart", - "uni-goods-nav.buttonGroup.addToCart": "add to cart", - "uni-goods-nav.buttonGroup.buyNow": "buy now" -} +{ + "uni-goods-nav.options.shop": "shop", + "uni-goods-nav.options.cart": "cart", + "uni-goods-nav.buttonGroup.addToCart": "add to cart", + "uni-goods-nav.buttonGroup.buyNow": "buy now" +} diff --git a/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/index.js b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/index.js index de7509c8..d2afd081 100644 --- a/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/index.js +++ b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/index.js @@ -1,8 +1,8 @@ -import en from './en.json' -import zhHans from './zh-Hans.json' -import zhHant from './zh-Hant.json' -export default { - en, - 'zh-Hans': zhHans, - 'zh-Hant': zhHant -} +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hans.json b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hans.json index 48ee344c..84243b03 100644 --- a/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hans.json +++ b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hans.json @@ -1,6 +1,6 @@ -{ - "uni-goods-nav.options.shop": "店铺", - "uni-goods-nav.options.cart": "购物车", - "uni-goods-nav.buttonGroup.addToCart": "加入购物车", - "uni-goods-nav.buttonGroup.buyNow": "立即购买" -} +{ + "uni-goods-nav.options.shop": "店铺", + "uni-goods-nav.options.cart": "购物车", + "uni-goods-nav.buttonGroup.addToCart": "加入购物车", + "uni-goods-nav.buttonGroup.buyNow": "立即购买" +} diff --git a/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hant.json b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hant.json index d0a0255c..bfd405e5 100644 --- a/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hant.json +++ b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hant.json @@ -1,6 +1,6 @@ -{ - "uni-goods-nav.options.shop": "店鋪", - "uni-goods-nav.options.cart": "購物車", - "uni-goods-nav.buttonGroup.addToCart": "加入購物車", - "uni-goods-nav.buttonGroup.buyNow": "立即購買" -} +{ + "uni-goods-nav.options.shop": "店鋪", + "uni-goods-nav.options.cart": "購物車", + "uni-goods-nav.buttonGroup.addToCart": "加入購物車", + "uni-goods-nav.buttonGroup.buyNow": "立即購買" +} diff --git a/uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue b/uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue index 8a16b175..3cc3cd9a 100644 --- a/uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue +++ b/uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue @@ -1,229 +1,229 @@ - - - - - + + + + + diff --git a/uni_modules/uni-goods-nav/package.json b/uni_modules/uni-goods-nav/package.json index 636e45e7..a68509b8 100644 --- a/uni_modules/uni-goods-nav/package.json +++ b/uni_modules/uni-goods-nav/package.json @@ -1,88 +1,88 @@ -{ - "id": "uni-goods-nav", - "displayName": "uni-goods-nav 商品导航", - "version": "1.2.1", - "description": "商品导航组件主要用于电商类应用底部导航,可自定义加入购物车,购买等操作", - "keywords": [ - "uni-ui", - "uniui", - "商品导航" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "" - }, - "directories": { - "example": "../../temps/example_temps" - }, - "dcloudext": { - "category": [ - "前端组件", - "通用组件" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" - }, - "uni_modules": { - "dependencies": [ - "uni-scss", - "uni-icons" - ], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "App": { - "app-vue": "y", - "app-nvue": "y" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" - }, - "快应用": { - "华为": "u", - "联盟": "u" - }, - "Vue": { - "vue2": "y", - "vue3": "y" - } - } - } - } -} +{ + "id": "uni-goods-nav", + "displayName": "uni-goods-nav 商品导航", + "version": "1.2.1", + "description": "商品导航组件主要用于电商类应用底部导航,可自定义加入购物车,购买等操作", + "keywords": [ + "uni-ui", + "uniui", + "商品导航" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-goods-nav/readme.md b/uni_modules/uni-goods-nav/readme.md index 07df93f5..67a74822 100644 --- a/uni_modules/uni-goods-nav/readme.md +++ b/uni_modules/uni-goods-nav/readme.md @@ -1,10 +1,10 @@ - - -## GoodsNav 商品导航 -> **组件名:uni-goods-nav** -> 代码块: `uGoodsNav` - -商品加入购物车,立即购买等。 - -### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-goods-nav) + + +## GoodsNav 商品导航 +> **组件名:uni-goods-nav** +> 代码块: `uGoodsNav` + +商品加入购物车,立即购买等。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-goods-nav) #### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-grid/changelog.md b/uni_modules/uni-grid/changelog.md index d301166c..d4801b81 100644 --- a/uni_modules/uni-grid/changelog.md +++ b/uni_modules/uni-grid/changelog.md @@ -1,13 +1,13 @@ -## 1.4.0(2021-11-19) -- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) -- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-grid](https://uniapp.dcloud.io/component/uniui/uni-grid) -## 1.3.2(2021-11-09) -- 新增 提供组件设计资源,组件样式调整 -## 1.3.1(2021-07-30) -- 优化 vue3下事件警告的问题 -## 1.3.0(2021-07-13) -- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -## 1.2.4(2021-05-12) -- 新增 组件示例地址 -## 1.2.3(2021-02-05) -- 调整为uni_modules目录规范 +## 1.4.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-grid](https://uniapp.dcloud.io/component/uniui/uni-grid) +## 1.3.2(2021-11-09) +- 新增 提供组件设计资源,组件样式调整 +## 1.3.1(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.3.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.2.4(2021-05-12) +- 新增 组件示例地址 +## 1.2.3(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue b/uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue index ecaeb25f..534c715b 100644 --- a/uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue +++ b/uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue @@ -1,140 +1,140 @@ - - - - - + + + + + diff --git a/uni_modules/uni-grid/components/uni-grid/uni-grid.vue b/uni_modules/uni-grid/components/uni-grid/uni-grid.vue index 0edc7ffe..009d0fd2 100644 --- a/uni_modules/uni-grid/components/uni-grid/uni-grid.vue +++ b/uni_modules/uni-grid/components/uni-grid/uni-grid.vue @@ -1,142 +1,142 @@ - - - - - + + + + + diff --git a/uni_modules/uni-grid/package.json b/uni_modules/uni-grid/package.json index ccb2c917..c68c9524 100644 --- a/uni_modules/uni-grid/package.json +++ b/uni_modules/uni-grid/package.json @@ -1,86 +1,86 @@ -{ - "id": "uni-grid", - "displayName": "uni-grid 宫格", - "version": "1.4.0", - "description": "Grid 宫格组件,提供移动端常见的宫格布局,如九宫格。", - "keywords": [ - "uni-ui", - "uniui", - "九宫格", - "表格" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "" - }, - "directories": { - "example": "../../temps/example_temps" - }, - "dcloudext": { - "category": [ - "前端组件", - "通用组件" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" - }, - "uni_modules": { - "dependencies": ["uni-scss","uni-icons"], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "App": { - "app-vue": "y", - "app-nvue": "y" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" - }, - "快应用": { - "华为": "u", - "联盟": "u" - }, - "Vue": { - "vue2": "y", - "vue3": "y" - } - } - } - } -} +{ + "id": "uni-grid", + "displayName": "uni-grid 宫格", + "version": "1.4.0", + "description": "Grid 宫格组件,提供移动端常见的宫格布局,如九宫格。", + "keywords": [ + "uni-ui", + "uniui", + "九宫格", + "表格" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss","uni-icons"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-grid/readme.md b/uni_modules/uni-grid/readme.md index 0aa44cc1..c0bd3b99 100644 --- a/uni_modules/uni-grid/readme.md +++ b/uni_modules/uni-grid/readme.md @@ -1,11 +1,11 @@ - - -## Grid 宫格 -> **组件名:uni-grid** -> 代码块: `uGrid` - - -宫格组件。 - -### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-grid) + + +## Grid 宫格 +> **组件名:uni-grid** +> 代码块: `uGrid` + + +宫格组件。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-grid) #### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-group/changelog.md b/uni_modules/uni-group/changelog.md index a7024fdf..5b27e3a4 100644 --- a/uni_modules/uni-group/changelog.md +++ b/uni_modules/uni-group/changelog.md @@ -1,16 +1,16 @@ -## 1.2.2(2022-05-30) -- 新增 stat属性,是否开启uni统计功能 -## 1.2.1(2021-11-22) -- 修复 vue3中某些scss变量无法找到的问题 -## 1.2.0(2021-11-19) -- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) -- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-group](https://uniapp.dcloud.io/component/uniui/uni-group) -## 1.1.7(2021-11-08) -## 1.1.0(2021-07-30) -- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -- 优化 组件文档 -## 1.0.3(2021-05-12) -- 新增 组件示例地址 -## 1.0.2(2021-02-05) -- 调整为uni_modules目录规范 -- 优化 兼容 nvue 页面 +## 1.2.2(2022-05-30) +- 新增 stat属性,是否开启uni统计功能 +## 1.2.1(2021-11-22) +- 修复 vue3中某些scss变量无法找到的问题 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-group](https://uniapp.dcloud.io/component/uniui/uni-group) +## 1.1.7(2021-11-08) +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +- 优化 组件文档 +## 1.0.3(2021-05-12) +- 新增 组件示例地址 +## 1.0.2(2021-02-05) +- 调整为uni_modules目录规范 +- 优化 兼容 nvue 页面 diff --git a/uni_modules/uni-group/components/uni-group/uni-group.vue b/uni_modules/uni-group/components/uni-group/uni-group.vue index 3425ecd3..0ff51a0c 100644 --- a/uni_modules/uni-group/components/uni-group/uni-group.vue +++ b/uni_modules/uni-group/components/uni-group/uni-group.vue @@ -1,134 +1,134 @@ - - - - + + + + diff --git a/uni_modules/uni-group/package.json b/uni_modules/uni-group/package.json index ea00a08c..779b3ae0 100644 --- a/uni_modules/uni-group/package.json +++ b/uni_modules/uni-group/package.json @@ -1,87 +1,87 @@ -{ - "id": "uni-group", - "displayName": "uni-group 分组", - "version": "1.2.2", - "description": "分组组件可用于将组件用于分组,添加间隔,以产生明显的区块", - "keywords": [ - "uni-ui", - "uniui", - "group", - "分组", - "" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "" - }, - "directories": { - "example": "../../temps/example_temps" - }, - "dcloudext": { - "category": [ - "前端组件", - "通用组件" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" - }, - "uni_modules": { - "dependencies": ["uni-scss"], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "App": { - "app-vue": "y", - "app-nvue": "y" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" - }, - "快应用": { - "华为": "u", - "联盟": "u" - }, - "Vue": { - "vue2": "y", - "vue3": "y" - } - } - } - } +{ + "id": "uni-group", + "displayName": "uni-group 分组", + "version": "1.2.2", + "description": "分组组件可用于将组件用于分组,添加间隔,以产生明显的区块", + "keywords": [ + "uni-ui", + "uniui", + "group", + "分组", + "" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } } \ No newline at end of file diff --git a/uni_modules/uni-group/readme.md b/uni_modules/uni-group/readme.md index bae67f46..16dac9ea 100644 --- a/uni_modules/uni-group/readme.md +++ b/uni_modules/uni-group/readme.md @@ -1,9 +1,9 @@ - -## Group 分组 -> **组件名:uni-group** -> 代码块: `uGroup` - -分组组件可用于将组件分组,添加间隔,以产生明显的区块。 - -### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-group) + +## Group 分组 +> **组件名:uni-group** +> 代码块: `uGroup` + +分组组件可用于将组件分组,添加间隔,以产生明显的区块。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-group) #### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-icons/changelog.md b/uni_modules/uni-icons/changelog.md index 64498853..074b2e7d 100644 --- a/uni_modules/uni-icons/changelog.md +++ b/uni_modules/uni-icons/changelog.md @@ -1,22 +1,22 @@ -## 1.3.5(2022-01-24) -- 优化 size 属性可以传入不带单位的字符串数值 -## 1.3.4(2022-01-24) -- 优化 size 支持其他单位 -## 1.3.3(2022-01-17) -- 修复 nvue 有些图标不显示的bug,兼容老版本图标 -## 1.3.2(2021-12-01) -- 优化 示例可复制图标名称 -## 1.3.1(2021-11-23) -- 优化 兼容旧组件 type 值 -## 1.3.0(2021-11-19) -- 新增 更多图标 -- 优化 自定义图标使用方式 -- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) -- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-icons](https://uniapp.dcloud.io/component/uniui/uni-icons) -## 1.1.7(2021-11-08) -## 1.2.0(2021-07-30) -- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -## 1.1.5(2021-05-12) -- 新增 组件示例地址 -## 1.1.4(2021-02-05) -- 调整为uni_modules目录规范 +## 1.3.5(2022-01-24) +- 优化 size 属性可以传入不带单位的字符串数值 +## 1.3.4(2022-01-24) +- 优化 size 支持其他单位 +## 1.3.3(2022-01-17) +- 修复 nvue 有些图标不显示的bug,兼容老版本图标 +## 1.3.2(2021-12-01) +- 优化 示例可复制图标名称 +## 1.3.1(2021-11-23) +- 优化 兼容旧组件 type 值 +## 1.3.0(2021-11-19) +- 新增 更多图标 +- 优化 自定义图标使用方式 +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-icons](https://uniapp.dcloud.io/component/uniui/uni-icons) +## 1.1.7(2021-11-08) +## 1.2.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.5(2021-05-12) +- 新增 组件示例地址 +## 1.1.4(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-icons/components/uni-icons/icons.js b/uni_modules/uni-icons/components/uni-icons/icons.js index 78899364..64257189 100644 --- a/uni_modules/uni-icons/components/uni-icons/icons.js +++ b/uni_modules/uni-icons/components/uni-icons/icons.js @@ -1,1169 +1,1169 @@ -export default { - "id": "2852637", - "name": "uniui图标库", - "font_family": "uniicons", - "css_prefix_text": "uniui-", - "description": "", - "glyphs": [ - { - "icon_id": "25027049", - "name": "yanse", - "font_class": "color", - "unicode": "e6cf", - "unicode_decimal": 59087 - }, - { - "icon_id": "25027048", - "name": "wallet", - "font_class": "wallet", - "unicode": "e6b1", - "unicode_decimal": 59057 - }, - { - "icon_id": "25015720", - "name": "settings-filled", - "font_class": "settings-filled", - "unicode": "e6ce", - "unicode_decimal": 59086 - }, - { - "icon_id": "25015434", - "name": "shimingrenzheng-filled", - "font_class": "auth-filled", - "unicode": "e6cc", - "unicode_decimal": 59084 - }, - { - "icon_id": "24934246", - "name": "shop-filled", - "font_class": "shop-filled", - "unicode": "e6cd", - "unicode_decimal": 59085 - }, - { - "icon_id": "24934159", - "name": "staff-filled-01", - "font_class": "staff-filled", - "unicode": "e6cb", - "unicode_decimal": 59083 - }, - { - "icon_id": "24932461", - "name": "VIP-filled", - "font_class": "vip-filled", - "unicode": "e6c6", - "unicode_decimal": 59078 - }, - { - "icon_id": "24932462", - "name": "plus_circle_fill", - "font_class": "plus-filled", - "unicode": "e6c7", - "unicode_decimal": 59079 - }, - { - "icon_id": "24932463", - "name": "folder_add-filled", - "font_class": "folder-add-filled", - "unicode": "e6c8", - "unicode_decimal": 59080 - }, - { - "icon_id": "24932464", - "name": "yanse-filled", - "font_class": "color-filled", - "unicode": "e6c9", - "unicode_decimal": 59081 - }, - { - "icon_id": "24932465", - "name": "tune-filled", - "font_class": "tune-filled", - "unicode": "e6ca", - "unicode_decimal": 59082 - }, - { - "icon_id": "24932455", - "name": "a-rilidaka-filled", - "font_class": "calendar-filled", - "unicode": "e6c0", - "unicode_decimal": 59072 - }, - { - "icon_id": "24932456", - "name": "notification-filled", - "font_class": "notification-filled", - "unicode": "e6c1", - "unicode_decimal": 59073 - }, - { - "icon_id": "24932457", - "name": "wallet-filled", - "font_class": "wallet-filled", - "unicode": "e6c2", - "unicode_decimal": 59074 - }, - { - "icon_id": "24932458", - "name": "paihangbang-filled", - "font_class": "medal-filled", - "unicode": "e6c3", - "unicode_decimal": 59075 - }, - { - "icon_id": "24932459", - "name": "gift-filled", - "font_class": "gift-filled", - "unicode": "e6c4", - "unicode_decimal": 59076 - }, - { - "icon_id": "24932460", - "name": "fire-filled", - "font_class": "fire-filled", - "unicode": "e6c5", - "unicode_decimal": 59077 - }, - { - "icon_id": "24928001", - "name": "refreshempty", - "font_class": "refreshempty", - "unicode": "e6bf", - "unicode_decimal": 59071 - }, - { - "icon_id": "24926853", - "name": "location-ellipse", - "font_class": "location-filled", - "unicode": "e6af", - "unicode_decimal": 59055 - }, - { - "icon_id": "24926735", - "name": "person-filled", - "font_class": "person-filled", - "unicode": "e69d", - "unicode_decimal": 59037 - }, - { - "icon_id": "24926703", - "name": "personadd-filled", - "font_class": "personadd-filled", - "unicode": "e698", - "unicode_decimal": 59032 - }, - { - "icon_id": "24923351", - "name": "back", - "font_class": "back", - "unicode": "e6b9", - "unicode_decimal": 59065 - }, - { - "icon_id": "24923352", - "name": "forward", - "font_class": "forward", - "unicode": "e6ba", - "unicode_decimal": 59066 - }, - { - "icon_id": "24923353", - "name": "arrowthinright", - "font_class": "arrow-right", - "unicode": "e6bb", - "unicode_decimal": 59067 - }, - { - "icon_id": "24923353", - "name": "arrowthinright", - "font_class": "arrowthinright", - "unicode": "e6bb", - "unicode_decimal": 59067 - }, - { - "icon_id": "24923354", - "name": "arrowthinleft", - "font_class": "arrow-left", - "unicode": "e6bc", - "unicode_decimal": 59068 - }, - { - "icon_id": "24923354", - "name": "arrowthinleft", - "font_class": "arrowthinleft", - "unicode": "e6bc", - "unicode_decimal": 59068 - }, - { - "icon_id": "24923355", - "name": "arrowthinup", - "font_class": "arrow-up", - "unicode": "e6bd", - "unicode_decimal": 59069 - }, - { - "icon_id": "24923355", - "name": "arrowthinup", - "font_class": "arrowthinup", - "unicode": "e6bd", - "unicode_decimal": 59069 - }, - { - "icon_id": "24923356", - "name": "arrowthindown", - "font_class": "arrow-down", - "unicode": "e6be", - "unicode_decimal": 59070 - },{ - "icon_id": "24923356", - "name": "arrowthindown", - "font_class": "arrowthindown", - "unicode": "e6be", - "unicode_decimal": 59070 - }, - { - "icon_id": "24923349", - "name": "arrowdown", - "font_class": "bottom", - "unicode": "e6b8", - "unicode_decimal": 59064 - },{ - "icon_id": "24923349", - "name": "arrowdown", - "font_class": "arrowdown", - "unicode": "e6b8", - "unicode_decimal": 59064 - }, - { - "icon_id": "24923346", - "name": "arrowright", - "font_class": "right", - "unicode": "e6b5", - "unicode_decimal": 59061 - }, - { - "icon_id": "24923346", - "name": "arrowright", - "font_class": "arrowright", - "unicode": "e6b5", - "unicode_decimal": 59061 - }, - { - "icon_id": "24923347", - "name": "arrowup", - "font_class": "top", - "unicode": "e6b6", - "unicode_decimal": 59062 - }, - { - "icon_id": "24923347", - "name": "arrowup", - "font_class": "arrowup", - "unicode": "e6b6", - "unicode_decimal": 59062 - }, - { - "icon_id": "24923348", - "name": "arrowleft", - "font_class": "left", - "unicode": "e6b7", - "unicode_decimal": 59063 - }, - { - "icon_id": "24923348", - "name": "arrowleft", - "font_class": "arrowleft", - "unicode": "e6b7", - "unicode_decimal": 59063 - }, - { - "icon_id": "24923334", - "name": "eye", - "font_class": "eye", - "unicode": "e651", - "unicode_decimal": 58961 - }, - { - "icon_id": "24923335", - "name": "eye-filled", - "font_class": "eye-filled", - "unicode": "e66a", - "unicode_decimal": 58986 - }, - { - "icon_id": "24923336", - "name": "eye-slash", - "font_class": "eye-slash", - "unicode": "e6b3", - "unicode_decimal": 59059 - }, - { - "icon_id": "24923337", - "name": "eye-slash-filled", - "font_class": "eye-slash-filled", - "unicode": "e6b4", - "unicode_decimal": 59060 - }, - { - "icon_id": "24923305", - "name": "info-filled", - "font_class": "info-filled", - "unicode": "e649", - "unicode_decimal": 58953 - }, - { - "icon_id": "24923299", - "name": "reload-01", - "font_class": "reload", - "unicode": "e6b2", - "unicode_decimal": 59058 - }, - { - "icon_id": "24923195", - "name": "mic_slash_fill", - "font_class": "micoff-filled", - "unicode": "e6b0", - "unicode_decimal": 59056 - }, - { - "icon_id": "24923165", - "name": "map-pin-ellipse", - "font_class": "map-pin-ellipse", - "unicode": "e6ac", - "unicode_decimal": 59052 - }, - { - "icon_id": "24923166", - "name": "map-pin", - "font_class": "map-pin", - "unicode": "e6ad", - "unicode_decimal": 59053 - }, - { - "icon_id": "24923167", - "name": "location", - "font_class": "location", - "unicode": "e6ae", - "unicode_decimal": 59054 - }, - { - "icon_id": "24923064", - "name": "starhalf", - "font_class": "starhalf", - "unicode": "e683", - "unicode_decimal": 59011 - }, - { - "icon_id": "24923065", - "name": "star", - "font_class": "star", - "unicode": "e688", - "unicode_decimal": 59016 - }, - { - "icon_id": "24923066", - "name": "star-filled", - "font_class": "star-filled", - "unicode": "e68f", - "unicode_decimal": 59023 - }, - { - "icon_id": "24899646", - "name": "a-rilidaka", - "font_class": "calendar", - "unicode": "e6a0", - "unicode_decimal": 59040 - }, - { - "icon_id": "24899647", - "name": "fire", - "font_class": "fire", - "unicode": "e6a1", - "unicode_decimal": 59041 - }, - { - "icon_id": "24899648", - "name": "paihangbang", - "font_class": "medal", - "unicode": "e6a2", - "unicode_decimal": 59042 - }, - { - "icon_id": "24899649", - "name": "font", - "font_class": "font", - "unicode": "e6a3", - "unicode_decimal": 59043 - }, - { - "icon_id": "24899650", - "name": "gift", - "font_class": "gift", - "unicode": "e6a4", - "unicode_decimal": 59044 - }, - { - "icon_id": "24899651", - "name": "link", - "font_class": "link", - "unicode": "e6a5", - "unicode_decimal": 59045 - }, - { - "icon_id": "24899652", - "name": "notification", - "font_class": "notification", - "unicode": "e6a6", - "unicode_decimal": 59046 - }, - { - "icon_id": "24899653", - "name": "staff", - "font_class": "staff", - "unicode": "e6a7", - "unicode_decimal": 59047 - }, - { - "icon_id": "24899654", - "name": "VIP", - "font_class": "vip", - "unicode": "e6a8", - "unicode_decimal": 59048 - }, - { - "icon_id": "24899655", - "name": "folder_add", - "font_class": "folder-add", - "unicode": "e6a9", - "unicode_decimal": 59049 - }, - { - "icon_id": "24899656", - "name": "tune", - "font_class": "tune", - "unicode": "e6aa", - "unicode_decimal": 59050 - }, - { - "icon_id": "24899657", - "name": "shimingrenzheng", - "font_class": "auth", - "unicode": "e6ab", - "unicode_decimal": 59051 - }, - { - "icon_id": "24899565", - "name": "person", - "font_class": "person", - "unicode": "e699", - "unicode_decimal": 59033 - }, - { - "icon_id": "24899566", - "name": "email-filled", - "font_class": "email-filled", - "unicode": "e69a", - "unicode_decimal": 59034 - }, - { - "icon_id": "24899567", - "name": "phone-filled", - "font_class": "phone-filled", - "unicode": "e69b", - "unicode_decimal": 59035 - }, - { - "icon_id": "24899568", - "name": "phone", - "font_class": "phone", - "unicode": "e69c", - "unicode_decimal": 59036 - }, - { - "icon_id": "24899570", - "name": "email", - "font_class": "email", - "unicode": "e69e", - "unicode_decimal": 59038 - }, - { - "icon_id": "24899571", - "name": "personadd", - "font_class": "personadd", - "unicode": "e69f", - "unicode_decimal": 59039 - }, - { - "icon_id": "24899558", - "name": "chatboxes-filled", - "font_class": "chatboxes-filled", - "unicode": "e692", - "unicode_decimal": 59026 - }, - { - "icon_id": "24899559", - "name": "contact", - "font_class": "contact", - "unicode": "e693", - "unicode_decimal": 59027 - }, - { - "icon_id": "24899560", - "name": "chatbubble-filled", - "font_class": "chatbubble-filled", - "unicode": "e694", - "unicode_decimal": 59028 - }, - { - "icon_id": "24899561", - "name": "contact-filled", - "font_class": "contact-filled", - "unicode": "e695", - "unicode_decimal": 59029 - }, - { - "icon_id": "24899562", - "name": "chatboxes", - "font_class": "chatboxes", - "unicode": "e696", - "unicode_decimal": 59030 - }, - { - "icon_id": "24899563", - "name": "chatbubble", - "font_class": "chatbubble", - "unicode": "e697", - "unicode_decimal": 59031 - }, - { - "icon_id": "24881290", - "name": "upload-filled", - "font_class": "upload-filled", - "unicode": "e68e", - "unicode_decimal": 59022 - }, - { - "icon_id": "24881292", - "name": "upload", - "font_class": "upload", - "unicode": "e690", - "unicode_decimal": 59024 - }, - { - "icon_id": "24881293", - "name": "weixin", - "font_class": "weixin", - "unicode": "e691", - "unicode_decimal": 59025 - }, - { - "icon_id": "24881274", - "name": "compose", - "font_class": "compose", - "unicode": "e67f", - "unicode_decimal": 59007 - }, - { - "icon_id": "24881275", - "name": "qq", - "font_class": "qq", - "unicode": "e680", - "unicode_decimal": 59008 - }, - { - "icon_id": "24881276", - "name": "download-filled", - "font_class": "download-filled", - "unicode": "e681", - "unicode_decimal": 59009 - }, - { - "icon_id": "24881277", - "name": "pengyouquan", - "font_class": "pyq", - "unicode": "e682", - "unicode_decimal": 59010 - }, - { - "icon_id": "24881279", - "name": "sound", - "font_class": "sound", - "unicode": "e684", - "unicode_decimal": 59012 - }, - { - "icon_id": "24881280", - "name": "trash-filled", - "font_class": "trash-filled", - "unicode": "e685", - "unicode_decimal": 59013 - }, - { - "icon_id": "24881281", - "name": "sound-filled", - "font_class": "sound-filled", - "unicode": "e686", - "unicode_decimal": 59014 - }, - { - "icon_id": "24881282", - "name": "trash", - "font_class": "trash", - "unicode": "e687", - "unicode_decimal": 59015 - }, - { - "icon_id": "24881284", - "name": "videocam-filled", - "font_class": "videocam-filled", - "unicode": "e689", - "unicode_decimal": 59017 - }, - { - "icon_id": "24881285", - "name": "spinner-cycle", - "font_class": "spinner-cycle", - "unicode": "e68a", - "unicode_decimal": 59018 - }, - { - "icon_id": "24881286", - "name": "weibo", - "font_class": "weibo", - "unicode": "e68b", - "unicode_decimal": 59019 - }, - { - "icon_id": "24881288", - "name": "videocam", - "font_class": "videocam", - "unicode": "e68c", - "unicode_decimal": 59020 - }, - { - "icon_id": "24881289", - "name": "download", - "font_class": "download", - "unicode": "e68d", - "unicode_decimal": 59021 - }, - { - "icon_id": "24879601", - "name": "help", - "font_class": "help", - "unicode": "e679", - "unicode_decimal": 59001 - }, - { - "icon_id": "24879602", - "name": "navigate-filled", - "font_class": "navigate-filled", - "unicode": "e67a", - "unicode_decimal": 59002 - }, - { - "icon_id": "24879603", - "name": "plusempty", - "font_class": "plusempty", - "unicode": "e67b", - "unicode_decimal": 59003 - }, - { - "icon_id": "24879604", - "name": "smallcircle", - "font_class": "smallcircle", - "unicode": "e67c", - "unicode_decimal": 59004 - }, - { - "icon_id": "24879605", - "name": "minus-filled", - "font_class": "minus-filled", - "unicode": "e67d", - "unicode_decimal": 59005 - }, - { - "icon_id": "24879606", - "name": "micoff", - "font_class": "micoff", - "unicode": "e67e", - "unicode_decimal": 59006 - }, - { - "icon_id": "24879588", - "name": "closeempty", - "font_class": "closeempty", - "unicode": "e66c", - "unicode_decimal": 58988 - }, - { - "icon_id": "24879589", - "name": "clear", - "font_class": "clear", - "unicode": "e66d", - "unicode_decimal": 58989 - }, - { - "icon_id": "24879590", - "name": "navigate", - "font_class": "navigate", - "unicode": "e66e", - "unicode_decimal": 58990 - }, - { - "icon_id": "24879591", - "name": "minus", - "font_class": "minus", - "unicode": "e66f", - "unicode_decimal": 58991 - }, - { - "icon_id": "24879592", - "name": "image", - "font_class": "image", - "unicode": "e670", - "unicode_decimal": 58992 - }, - { - "icon_id": "24879593", - "name": "mic", - "font_class": "mic", - "unicode": "e671", - "unicode_decimal": 58993 - }, - { - "icon_id": "24879594", - "name": "paperplane", - "font_class": "paperplane", - "unicode": "e672", - "unicode_decimal": 58994 - }, - { - "icon_id": "24879595", - "name": "close", - "font_class": "close", - "unicode": "e673", - "unicode_decimal": 58995 - }, - { - "icon_id": "24879596", - "name": "help-filled", - "font_class": "help-filled", - "unicode": "e674", - "unicode_decimal": 58996 - }, - { - "icon_id": "24879597", - "name": "plus-filled", - "font_class": "paperplane-filled", - "unicode": "e675", - "unicode_decimal": 58997 - }, - { - "icon_id": "24879598", - "name": "plus", - "font_class": "plus", - "unicode": "e676", - "unicode_decimal": 58998 - }, - { - "icon_id": "24879599", - "name": "mic-filled", - "font_class": "mic-filled", - "unicode": "e677", - "unicode_decimal": 58999 - }, - { - "icon_id": "24879600", - "name": "image-filled", - "font_class": "image-filled", - "unicode": "e678", - "unicode_decimal": 59000 - }, - { - "icon_id": "24855900", - "name": "locked-filled", - "font_class": "locked-filled", - "unicode": "e668", - "unicode_decimal": 58984 - }, - { - "icon_id": "24855901", - "name": "info", - "font_class": "info", - "unicode": "e669", - "unicode_decimal": 58985 - }, - { - "icon_id": "24855903", - "name": "locked", - "font_class": "locked", - "unicode": "e66b", - "unicode_decimal": 58987 - }, - { - "icon_id": "24855884", - "name": "camera-filled", - "font_class": "camera-filled", - "unicode": "e658", - "unicode_decimal": 58968 - }, - { - "icon_id": "24855885", - "name": "chat-filled", - "font_class": "chat-filled", - "unicode": "e659", - "unicode_decimal": 58969 - }, - { - "icon_id": "24855886", - "name": "camera", - "font_class": "camera", - "unicode": "e65a", - "unicode_decimal": 58970 - }, - { - "icon_id": "24855887", - "name": "circle", - "font_class": "circle", - "unicode": "e65b", - "unicode_decimal": 58971 - }, - { - "icon_id": "24855888", - "name": "checkmarkempty", - "font_class": "checkmarkempty", - "unicode": "e65c", - "unicode_decimal": 58972 - }, - { - "icon_id": "24855889", - "name": "chat", - "font_class": "chat", - "unicode": "e65d", - "unicode_decimal": 58973 - }, - { - "icon_id": "24855890", - "name": "circle-filled", - "font_class": "circle-filled", - "unicode": "e65e", - "unicode_decimal": 58974 - }, - { - "icon_id": "24855891", - "name": "flag", - "font_class": "flag", - "unicode": "e65f", - "unicode_decimal": 58975 - }, - { - "icon_id": "24855892", - "name": "flag-filled", - "font_class": "flag-filled", - "unicode": "e660", - "unicode_decimal": 58976 - }, - { - "icon_id": "24855893", - "name": "gear-filled", - "font_class": "gear-filled", - "unicode": "e661", - "unicode_decimal": 58977 - }, - { - "icon_id": "24855894", - "name": "home", - "font_class": "home", - "unicode": "e662", - "unicode_decimal": 58978 - }, - { - "icon_id": "24855895", - "name": "home-filled", - "font_class": "home-filled", - "unicode": "e663", - "unicode_decimal": 58979 - }, - { - "icon_id": "24855896", - "name": "gear", - "font_class": "gear", - "unicode": "e664", - "unicode_decimal": 58980 - }, - { - "icon_id": "24855897", - "name": "smallcircle-filled", - "font_class": "smallcircle-filled", - "unicode": "e665", - "unicode_decimal": 58981 - }, - { - "icon_id": "24855898", - "name": "map-filled", - "font_class": "map-filled", - "unicode": "e666", - "unicode_decimal": 58982 - }, - { - "icon_id": "24855899", - "name": "map", - "font_class": "map", - "unicode": "e667", - "unicode_decimal": 58983 - }, - { - "icon_id": "24855825", - "name": "refresh-filled", - "font_class": "refresh-filled", - "unicode": "e656", - "unicode_decimal": 58966 - }, - { - "icon_id": "24855826", - "name": "refresh", - "font_class": "refresh", - "unicode": "e657", - "unicode_decimal": 58967 - }, - { - "icon_id": "24855808", - "name": "cloud-upload", - "font_class": "cloud-upload", - "unicode": "e645", - "unicode_decimal": 58949 - }, - { - "icon_id": "24855809", - "name": "cloud-download-filled", - "font_class": "cloud-download-filled", - "unicode": "e646", - "unicode_decimal": 58950 - }, - { - "icon_id": "24855810", - "name": "cloud-download", - "font_class": "cloud-download", - "unicode": "e647", - "unicode_decimal": 58951 - }, - { - "icon_id": "24855811", - "name": "cloud-upload-filled", - "font_class": "cloud-upload-filled", - "unicode": "e648", - "unicode_decimal": 58952 - }, - { - "icon_id": "24855813", - "name": "redo", - "font_class": "redo", - "unicode": "e64a", - "unicode_decimal": 58954 - }, - { - "icon_id": "24855814", - "name": "images-filled", - "font_class": "images-filled", - "unicode": "e64b", - "unicode_decimal": 58955 - }, - { - "icon_id": "24855815", - "name": "undo-filled", - "font_class": "undo-filled", - "unicode": "e64c", - "unicode_decimal": 58956 - }, - { - "icon_id": "24855816", - "name": "more", - "font_class": "more", - "unicode": "e64d", - "unicode_decimal": 58957 - }, - { - "icon_id": "24855817", - "name": "more-filled", - "font_class": "more-filled", - "unicode": "e64e", - "unicode_decimal": 58958 - }, - { - "icon_id": "24855818", - "name": "undo", - "font_class": "undo", - "unicode": "e64f", - "unicode_decimal": 58959 - }, - { - "icon_id": "24855819", - "name": "images", - "font_class": "images", - "unicode": "e650", - "unicode_decimal": 58960 - }, - { - "icon_id": "24855821", - "name": "paperclip", - "font_class": "paperclip", - "unicode": "e652", - "unicode_decimal": 58962 - }, - { - "icon_id": "24855822", - "name": "settings", - "font_class": "settings", - "unicode": "e653", - "unicode_decimal": 58963 - }, - { - "icon_id": "24855823", - "name": "search", - "font_class": "search", - "unicode": "e654", - "unicode_decimal": 58964 - }, - { - "icon_id": "24855824", - "name": "redo-filled", - "font_class": "redo-filled", - "unicode": "e655", - "unicode_decimal": 58965 - }, - { - "icon_id": "24841702", - "name": "list", - "font_class": "list", - "unicode": "e644", - "unicode_decimal": 58948 - }, - { - "icon_id": "24841489", - "name": "mail-open-filled", - "font_class": "mail-open-filled", - "unicode": "e63a", - "unicode_decimal": 58938 - }, - { - "icon_id": "24841491", - "name": "hand-thumbsdown-filled", - "font_class": "hand-down-filled", - "unicode": "e63c", - "unicode_decimal": 58940 - }, - { - "icon_id": "24841492", - "name": "hand-thumbsdown", - "font_class": "hand-down", - "unicode": "e63d", - "unicode_decimal": 58941 - }, - { - "icon_id": "24841493", - "name": "hand-thumbsup-filled", - "font_class": "hand-up-filled", - "unicode": "e63e", - "unicode_decimal": 58942 - }, - { - "icon_id": "24841494", - "name": "hand-thumbsup", - "font_class": "hand-up", - "unicode": "e63f", - "unicode_decimal": 58943 - }, - { - "icon_id": "24841496", - "name": "heart-filled", - "font_class": "heart-filled", - "unicode": "e641", - "unicode_decimal": 58945 - }, - { - "icon_id": "24841498", - "name": "mail-open", - "font_class": "mail-open", - "unicode": "e643", - "unicode_decimal": 58947 - }, - { - "icon_id": "24841488", - "name": "heart", - "font_class": "heart", - "unicode": "e639", - "unicode_decimal": 58937 - }, - { - "icon_id": "24839963", - "name": "loop", - "font_class": "loop", - "unicode": "e633", - "unicode_decimal": 58931 - }, - { - "icon_id": "24839866", - "name": "pulldown", - "font_class": "pulldown", - "unicode": "e632", - "unicode_decimal": 58930 - }, - { - "icon_id": "24813798", - "name": "scan", - "font_class": "scan", - "unicode": "e62a", - "unicode_decimal": 58922 - }, - { - "icon_id": "24813786", - "name": "bars", - "font_class": "bars", - "unicode": "e627", - "unicode_decimal": 58919 - }, - { - "icon_id": "24813788", - "name": "cart-filled", - "font_class": "cart-filled", - "unicode": "e629", - "unicode_decimal": 58921 - }, - { - "icon_id": "24813790", - "name": "checkbox", - "font_class": "checkbox", - "unicode": "e62b", - "unicode_decimal": 58923 - }, - { - "icon_id": "24813791", - "name": "checkbox-filled", - "font_class": "checkbox-filled", - "unicode": "e62c", - "unicode_decimal": 58924 - }, - { - "icon_id": "24813794", - "name": "shop", - "font_class": "shop", - "unicode": "e62f", - "unicode_decimal": 58927 - }, - { - "icon_id": "24813795", - "name": "headphones", - "font_class": "headphones", - "unicode": "e630", - "unicode_decimal": 58928 - }, - { - "icon_id": "24813796", - "name": "cart", - "font_class": "cart", - "unicode": "e631", - "unicode_decimal": 58929 - } - ] -} +export default { + "id": "2852637", + "name": "uniui图标库", + "font_family": "uniicons", + "css_prefix_text": "uniui-", + "description": "", + "glyphs": [ + { + "icon_id": "25027049", + "name": "yanse", + "font_class": "color", + "unicode": "e6cf", + "unicode_decimal": 59087 + }, + { + "icon_id": "25027048", + "name": "wallet", + "font_class": "wallet", + "unicode": "e6b1", + "unicode_decimal": 59057 + }, + { + "icon_id": "25015720", + "name": "settings-filled", + "font_class": "settings-filled", + "unicode": "e6ce", + "unicode_decimal": 59086 + }, + { + "icon_id": "25015434", + "name": "shimingrenzheng-filled", + "font_class": "auth-filled", + "unicode": "e6cc", + "unicode_decimal": 59084 + }, + { + "icon_id": "24934246", + "name": "shop-filled", + "font_class": "shop-filled", + "unicode": "e6cd", + "unicode_decimal": 59085 + }, + { + "icon_id": "24934159", + "name": "staff-filled-01", + "font_class": "staff-filled", + "unicode": "e6cb", + "unicode_decimal": 59083 + }, + { + "icon_id": "24932461", + "name": "VIP-filled", + "font_class": "vip-filled", + "unicode": "e6c6", + "unicode_decimal": 59078 + }, + { + "icon_id": "24932462", + "name": "plus_circle_fill", + "font_class": "plus-filled", + "unicode": "e6c7", + "unicode_decimal": 59079 + }, + { + "icon_id": "24932463", + "name": "folder_add-filled", + "font_class": "folder-add-filled", + "unicode": "e6c8", + "unicode_decimal": 59080 + }, + { + "icon_id": "24932464", + "name": "yanse-filled", + "font_class": "color-filled", + "unicode": "e6c9", + "unicode_decimal": 59081 + }, + { + "icon_id": "24932465", + "name": "tune-filled", + "font_class": "tune-filled", + "unicode": "e6ca", + "unicode_decimal": 59082 + }, + { + "icon_id": "24932455", + "name": "a-rilidaka-filled", + "font_class": "calendar-filled", + "unicode": "e6c0", + "unicode_decimal": 59072 + }, + { + "icon_id": "24932456", + "name": "notification-filled", + "font_class": "notification-filled", + "unicode": "e6c1", + "unicode_decimal": 59073 + }, + { + "icon_id": "24932457", + "name": "wallet-filled", + "font_class": "wallet-filled", + "unicode": "e6c2", + "unicode_decimal": 59074 + }, + { + "icon_id": "24932458", + "name": "paihangbang-filled", + "font_class": "medal-filled", + "unicode": "e6c3", + "unicode_decimal": 59075 + }, + { + "icon_id": "24932459", + "name": "gift-filled", + "font_class": "gift-filled", + "unicode": "e6c4", + "unicode_decimal": 59076 + }, + { + "icon_id": "24932460", + "name": "fire-filled", + "font_class": "fire-filled", + "unicode": "e6c5", + "unicode_decimal": 59077 + }, + { + "icon_id": "24928001", + "name": "refreshempty", + "font_class": "refreshempty", + "unicode": "e6bf", + "unicode_decimal": 59071 + }, + { + "icon_id": "24926853", + "name": "location-ellipse", + "font_class": "location-filled", + "unicode": "e6af", + "unicode_decimal": 59055 + }, + { + "icon_id": "24926735", + "name": "person-filled", + "font_class": "person-filled", + "unicode": "e69d", + "unicode_decimal": 59037 + }, + { + "icon_id": "24926703", + "name": "personadd-filled", + "font_class": "personadd-filled", + "unicode": "e698", + "unicode_decimal": 59032 + }, + { + "icon_id": "24923351", + "name": "back", + "font_class": "back", + "unicode": "e6b9", + "unicode_decimal": 59065 + }, + { + "icon_id": "24923352", + "name": "forward", + "font_class": "forward", + "unicode": "e6ba", + "unicode_decimal": 59066 + }, + { + "icon_id": "24923353", + "name": "arrowthinright", + "font_class": "arrow-right", + "unicode": "e6bb", + "unicode_decimal": 59067 + }, + { + "icon_id": "24923353", + "name": "arrowthinright", + "font_class": "arrowthinright", + "unicode": "e6bb", + "unicode_decimal": 59067 + }, + { + "icon_id": "24923354", + "name": "arrowthinleft", + "font_class": "arrow-left", + "unicode": "e6bc", + "unicode_decimal": 59068 + }, + { + "icon_id": "24923354", + "name": "arrowthinleft", + "font_class": "arrowthinleft", + "unicode": "e6bc", + "unicode_decimal": 59068 + }, + { + "icon_id": "24923355", + "name": "arrowthinup", + "font_class": "arrow-up", + "unicode": "e6bd", + "unicode_decimal": 59069 + }, + { + "icon_id": "24923355", + "name": "arrowthinup", + "font_class": "arrowthinup", + "unicode": "e6bd", + "unicode_decimal": 59069 + }, + { + "icon_id": "24923356", + "name": "arrowthindown", + "font_class": "arrow-down", + "unicode": "e6be", + "unicode_decimal": 59070 + },{ + "icon_id": "24923356", + "name": "arrowthindown", + "font_class": "arrowthindown", + "unicode": "e6be", + "unicode_decimal": 59070 + }, + { + "icon_id": "24923349", + "name": "arrowdown", + "font_class": "bottom", + "unicode": "e6b8", + "unicode_decimal": 59064 + },{ + "icon_id": "24923349", + "name": "arrowdown", + "font_class": "arrowdown", + "unicode": "e6b8", + "unicode_decimal": 59064 + }, + { + "icon_id": "24923346", + "name": "arrowright", + "font_class": "right", + "unicode": "e6b5", + "unicode_decimal": 59061 + }, + { + "icon_id": "24923346", + "name": "arrowright", + "font_class": "arrowright", + "unicode": "e6b5", + "unicode_decimal": 59061 + }, + { + "icon_id": "24923347", + "name": "arrowup", + "font_class": "top", + "unicode": "e6b6", + "unicode_decimal": 59062 + }, + { + "icon_id": "24923347", + "name": "arrowup", + "font_class": "arrowup", + "unicode": "e6b6", + "unicode_decimal": 59062 + }, + { + "icon_id": "24923348", + "name": "arrowleft", + "font_class": "left", + "unicode": "e6b7", + "unicode_decimal": 59063 + }, + { + "icon_id": "24923348", + "name": "arrowleft", + "font_class": "arrowleft", + "unicode": "e6b7", + "unicode_decimal": 59063 + }, + { + "icon_id": "24923334", + "name": "eye", + "font_class": "eye", + "unicode": "e651", + "unicode_decimal": 58961 + }, + { + "icon_id": "24923335", + "name": "eye-filled", + "font_class": "eye-filled", + "unicode": "e66a", + "unicode_decimal": 58986 + }, + { + "icon_id": "24923336", + "name": "eye-slash", + "font_class": "eye-slash", + "unicode": "e6b3", + "unicode_decimal": 59059 + }, + { + "icon_id": "24923337", + "name": "eye-slash-filled", + "font_class": "eye-slash-filled", + "unicode": "e6b4", + "unicode_decimal": 59060 + }, + { + "icon_id": "24923305", + "name": "info-filled", + "font_class": "info-filled", + "unicode": "e649", + "unicode_decimal": 58953 + }, + { + "icon_id": "24923299", + "name": "reload-01", + "font_class": "reload", + "unicode": "e6b2", + "unicode_decimal": 59058 + }, + { + "icon_id": "24923195", + "name": "mic_slash_fill", + "font_class": "micoff-filled", + "unicode": "e6b0", + "unicode_decimal": 59056 + }, + { + "icon_id": "24923165", + "name": "map-pin-ellipse", + "font_class": "map-pin-ellipse", + "unicode": "e6ac", + "unicode_decimal": 59052 + }, + { + "icon_id": "24923166", + "name": "map-pin", + "font_class": "map-pin", + "unicode": "e6ad", + "unicode_decimal": 59053 + }, + { + "icon_id": "24923167", + "name": "location", + "font_class": "location", + "unicode": "e6ae", + "unicode_decimal": 59054 + }, + { + "icon_id": "24923064", + "name": "starhalf", + "font_class": "starhalf", + "unicode": "e683", + "unicode_decimal": 59011 + }, + { + "icon_id": "24923065", + "name": "star", + "font_class": "star", + "unicode": "e688", + "unicode_decimal": 59016 + }, + { + "icon_id": "24923066", + "name": "star-filled", + "font_class": "star-filled", + "unicode": "e68f", + "unicode_decimal": 59023 + }, + { + "icon_id": "24899646", + "name": "a-rilidaka", + "font_class": "calendar", + "unicode": "e6a0", + "unicode_decimal": 59040 + }, + { + "icon_id": "24899647", + "name": "fire", + "font_class": "fire", + "unicode": "e6a1", + "unicode_decimal": 59041 + }, + { + "icon_id": "24899648", + "name": "paihangbang", + "font_class": "medal", + "unicode": "e6a2", + "unicode_decimal": 59042 + }, + { + "icon_id": "24899649", + "name": "font", + "font_class": "font", + "unicode": "e6a3", + "unicode_decimal": 59043 + }, + { + "icon_id": "24899650", + "name": "gift", + "font_class": "gift", + "unicode": "e6a4", + "unicode_decimal": 59044 + }, + { + "icon_id": "24899651", + "name": "link", + "font_class": "link", + "unicode": "e6a5", + "unicode_decimal": 59045 + }, + { + "icon_id": "24899652", + "name": "notification", + "font_class": "notification", + "unicode": "e6a6", + "unicode_decimal": 59046 + }, + { + "icon_id": "24899653", + "name": "staff", + "font_class": "staff", + "unicode": "e6a7", + "unicode_decimal": 59047 + }, + { + "icon_id": "24899654", + "name": "VIP", + "font_class": "vip", + "unicode": "e6a8", + "unicode_decimal": 59048 + }, + { + "icon_id": "24899655", + "name": "folder_add", + "font_class": "folder-add", + "unicode": "e6a9", + "unicode_decimal": 59049 + }, + { + "icon_id": "24899656", + "name": "tune", + "font_class": "tune", + "unicode": "e6aa", + "unicode_decimal": 59050 + }, + { + "icon_id": "24899657", + "name": "shimingrenzheng", + "font_class": "auth", + "unicode": "e6ab", + "unicode_decimal": 59051 + }, + { + "icon_id": "24899565", + "name": "person", + "font_class": "person", + "unicode": "e699", + "unicode_decimal": 59033 + }, + { + "icon_id": "24899566", + "name": "email-filled", + "font_class": "email-filled", + "unicode": "e69a", + "unicode_decimal": 59034 + }, + { + "icon_id": "24899567", + "name": "phone-filled", + "font_class": "phone-filled", + "unicode": "e69b", + "unicode_decimal": 59035 + }, + { + "icon_id": "24899568", + "name": "phone", + "font_class": "phone", + "unicode": "e69c", + "unicode_decimal": 59036 + }, + { + "icon_id": "24899570", + "name": "email", + "font_class": "email", + "unicode": "e69e", + "unicode_decimal": 59038 + }, + { + "icon_id": "24899571", + "name": "personadd", + "font_class": "personadd", + "unicode": "e69f", + "unicode_decimal": 59039 + }, + { + "icon_id": "24899558", + "name": "chatboxes-filled", + "font_class": "chatboxes-filled", + "unicode": "e692", + "unicode_decimal": 59026 + }, + { + "icon_id": "24899559", + "name": "contact", + "font_class": "contact", + "unicode": "e693", + "unicode_decimal": 59027 + }, + { + "icon_id": "24899560", + "name": "chatbubble-filled", + "font_class": "chatbubble-filled", + "unicode": "e694", + "unicode_decimal": 59028 + }, + { + "icon_id": "24899561", + "name": "contact-filled", + "font_class": "contact-filled", + "unicode": "e695", + "unicode_decimal": 59029 + }, + { + "icon_id": "24899562", + "name": "chatboxes", + "font_class": "chatboxes", + "unicode": "e696", + "unicode_decimal": 59030 + }, + { + "icon_id": "24899563", + "name": "chatbubble", + "font_class": "chatbubble", + "unicode": "e697", + "unicode_decimal": 59031 + }, + { + "icon_id": "24881290", + "name": "upload-filled", + "font_class": "upload-filled", + "unicode": "e68e", + "unicode_decimal": 59022 + }, + { + "icon_id": "24881292", + "name": "upload", + "font_class": "upload", + "unicode": "e690", + "unicode_decimal": 59024 + }, + { + "icon_id": "24881293", + "name": "weixin", + "font_class": "weixin", + "unicode": "e691", + "unicode_decimal": 59025 + }, + { + "icon_id": "24881274", + "name": "compose", + "font_class": "compose", + "unicode": "e67f", + "unicode_decimal": 59007 + }, + { + "icon_id": "24881275", + "name": "qq", + "font_class": "qq", + "unicode": "e680", + "unicode_decimal": 59008 + }, + { + "icon_id": "24881276", + "name": "download-filled", + "font_class": "download-filled", + "unicode": "e681", + "unicode_decimal": 59009 + }, + { + "icon_id": "24881277", + "name": "pengyouquan", + "font_class": "pyq", + "unicode": "e682", + "unicode_decimal": 59010 + }, + { + "icon_id": "24881279", + "name": "sound", + "font_class": "sound", + "unicode": "e684", + "unicode_decimal": 59012 + }, + { + "icon_id": "24881280", + "name": "trash-filled", + "font_class": "trash-filled", + "unicode": "e685", + "unicode_decimal": 59013 + }, + { + "icon_id": "24881281", + "name": "sound-filled", + "font_class": "sound-filled", + "unicode": "e686", + "unicode_decimal": 59014 + }, + { + "icon_id": "24881282", + "name": "trash", + "font_class": "trash", + "unicode": "e687", + "unicode_decimal": 59015 + }, + { + "icon_id": "24881284", + "name": "videocam-filled", + "font_class": "videocam-filled", + "unicode": "e689", + "unicode_decimal": 59017 + }, + { + "icon_id": "24881285", + "name": "spinner-cycle", + "font_class": "spinner-cycle", + "unicode": "e68a", + "unicode_decimal": 59018 + }, + { + "icon_id": "24881286", + "name": "weibo", + "font_class": "weibo", + "unicode": "e68b", + "unicode_decimal": 59019 + }, + { + "icon_id": "24881288", + "name": "videocam", + "font_class": "videocam", + "unicode": "e68c", + "unicode_decimal": 59020 + }, + { + "icon_id": "24881289", + "name": "download", + "font_class": "download", + "unicode": "e68d", + "unicode_decimal": 59021 + }, + { + "icon_id": "24879601", + "name": "help", + "font_class": "help", + "unicode": "e679", + "unicode_decimal": 59001 + }, + { + "icon_id": "24879602", + "name": "navigate-filled", + "font_class": "navigate-filled", + "unicode": "e67a", + "unicode_decimal": 59002 + }, + { + "icon_id": "24879603", + "name": "plusempty", + "font_class": "plusempty", + "unicode": "e67b", + "unicode_decimal": 59003 + }, + { + "icon_id": "24879604", + "name": "smallcircle", + "font_class": "smallcircle", + "unicode": "e67c", + "unicode_decimal": 59004 + }, + { + "icon_id": "24879605", + "name": "minus-filled", + "font_class": "minus-filled", + "unicode": "e67d", + "unicode_decimal": 59005 + }, + { + "icon_id": "24879606", + "name": "micoff", + "font_class": "micoff", + "unicode": "e67e", + "unicode_decimal": 59006 + }, + { + "icon_id": "24879588", + "name": "closeempty", + "font_class": "closeempty", + "unicode": "e66c", + "unicode_decimal": 58988 + }, + { + "icon_id": "24879589", + "name": "clear", + "font_class": "clear", + "unicode": "e66d", + "unicode_decimal": 58989 + }, + { + "icon_id": "24879590", + "name": "navigate", + "font_class": "navigate", + "unicode": "e66e", + "unicode_decimal": 58990 + }, + { + "icon_id": "24879591", + "name": "minus", + "font_class": "minus", + "unicode": "e66f", + "unicode_decimal": 58991 + }, + { + "icon_id": "24879592", + "name": "image", + "font_class": "image", + "unicode": "e670", + "unicode_decimal": 58992 + }, + { + "icon_id": "24879593", + "name": "mic", + "font_class": "mic", + "unicode": "e671", + "unicode_decimal": 58993 + }, + { + "icon_id": "24879594", + "name": "paperplane", + "font_class": "paperplane", + "unicode": "e672", + "unicode_decimal": 58994 + }, + { + "icon_id": "24879595", + "name": "close", + "font_class": "close", + "unicode": "e673", + "unicode_decimal": 58995 + }, + { + "icon_id": "24879596", + "name": "help-filled", + "font_class": "help-filled", + "unicode": "e674", + "unicode_decimal": 58996 + }, + { + "icon_id": "24879597", + "name": "plus-filled", + "font_class": "paperplane-filled", + "unicode": "e675", + "unicode_decimal": 58997 + }, + { + "icon_id": "24879598", + "name": "plus", + "font_class": "plus", + "unicode": "e676", + "unicode_decimal": 58998 + }, + { + "icon_id": "24879599", + "name": "mic-filled", + "font_class": "mic-filled", + "unicode": "e677", + "unicode_decimal": 58999 + }, + { + "icon_id": "24879600", + "name": "image-filled", + "font_class": "image-filled", + "unicode": "e678", + "unicode_decimal": 59000 + }, + { + "icon_id": "24855900", + "name": "locked-filled", + "font_class": "locked-filled", + "unicode": "e668", + "unicode_decimal": 58984 + }, + { + "icon_id": "24855901", + "name": "info", + "font_class": "info", + "unicode": "e669", + "unicode_decimal": 58985 + }, + { + "icon_id": "24855903", + "name": "locked", + "font_class": "locked", + "unicode": "e66b", + "unicode_decimal": 58987 + }, + { + "icon_id": "24855884", + "name": "camera-filled", + "font_class": "camera-filled", + "unicode": "e658", + "unicode_decimal": 58968 + }, + { + "icon_id": "24855885", + "name": "chat-filled", + "font_class": "chat-filled", + "unicode": "e659", + "unicode_decimal": 58969 + }, + { + "icon_id": "24855886", + "name": "camera", + "font_class": "camera", + "unicode": "e65a", + "unicode_decimal": 58970 + }, + { + "icon_id": "24855887", + "name": "circle", + "font_class": "circle", + "unicode": "e65b", + "unicode_decimal": 58971 + }, + { + "icon_id": "24855888", + "name": "checkmarkempty", + "font_class": "checkmarkempty", + "unicode": "e65c", + "unicode_decimal": 58972 + }, + { + "icon_id": "24855889", + "name": "chat", + "font_class": "chat", + "unicode": "e65d", + "unicode_decimal": 58973 + }, + { + "icon_id": "24855890", + "name": "circle-filled", + "font_class": "circle-filled", + "unicode": "e65e", + "unicode_decimal": 58974 + }, + { + "icon_id": "24855891", + "name": "flag", + "font_class": "flag", + "unicode": "e65f", + "unicode_decimal": 58975 + }, + { + "icon_id": "24855892", + "name": "flag-filled", + "font_class": "flag-filled", + "unicode": "e660", + "unicode_decimal": 58976 + }, + { + "icon_id": "24855893", + "name": "gear-filled", + "font_class": "gear-filled", + "unicode": "e661", + "unicode_decimal": 58977 + }, + { + "icon_id": "24855894", + "name": "home", + "font_class": "home", + "unicode": "e662", + "unicode_decimal": 58978 + }, + { + "icon_id": "24855895", + "name": "home-filled", + "font_class": "home-filled", + "unicode": "e663", + "unicode_decimal": 58979 + }, + { + "icon_id": "24855896", + "name": "gear", + "font_class": "gear", + "unicode": "e664", + "unicode_decimal": 58980 + }, + { + "icon_id": "24855897", + "name": "smallcircle-filled", + "font_class": "smallcircle-filled", + "unicode": "e665", + "unicode_decimal": 58981 + }, + { + "icon_id": "24855898", + "name": "map-filled", + "font_class": "map-filled", + "unicode": "e666", + "unicode_decimal": 58982 + }, + { + "icon_id": "24855899", + "name": "map", + "font_class": "map", + "unicode": "e667", + "unicode_decimal": 58983 + }, + { + "icon_id": "24855825", + "name": "refresh-filled", + "font_class": "refresh-filled", + "unicode": "e656", + "unicode_decimal": 58966 + }, + { + "icon_id": "24855826", + "name": "refresh", + "font_class": "refresh", + "unicode": "e657", + "unicode_decimal": 58967 + }, + { + "icon_id": "24855808", + "name": "cloud-upload", + "font_class": "cloud-upload", + "unicode": "e645", + "unicode_decimal": 58949 + }, + { + "icon_id": "24855809", + "name": "cloud-download-filled", + "font_class": "cloud-download-filled", + "unicode": "e646", + "unicode_decimal": 58950 + }, + { + "icon_id": "24855810", + "name": "cloud-download", + "font_class": "cloud-download", + "unicode": "e647", + "unicode_decimal": 58951 + }, + { + "icon_id": "24855811", + "name": "cloud-upload-filled", + "font_class": "cloud-upload-filled", + "unicode": "e648", + "unicode_decimal": 58952 + }, + { + "icon_id": "24855813", + "name": "redo", + "font_class": "redo", + "unicode": "e64a", + "unicode_decimal": 58954 + }, + { + "icon_id": "24855814", + "name": "images-filled", + "font_class": "images-filled", + "unicode": "e64b", + "unicode_decimal": 58955 + }, + { + "icon_id": "24855815", + "name": "undo-filled", + "font_class": "undo-filled", + "unicode": "e64c", + "unicode_decimal": 58956 + }, + { + "icon_id": "24855816", + "name": "more", + "font_class": "more", + "unicode": "e64d", + "unicode_decimal": 58957 + }, + { + "icon_id": "24855817", + "name": "more-filled", + "font_class": "more-filled", + "unicode": "e64e", + "unicode_decimal": 58958 + }, + { + "icon_id": "24855818", + "name": "undo", + "font_class": "undo", + "unicode": "e64f", + "unicode_decimal": 58959 + }, + { + "icon_id": "24855819", + "name": "images", + "font_class": "images", + "unicode": "e650", + "unicode_decimal": 58960 + }, + { + "icon_id": "24855821", + "name": "paperclip", + "font_class": "paperclip", + "unicode": "e652", + "unicode_decimal": 58962 + }, + { + "icon_id": "24855822", + "name": "settings", + "font_class": "settings", + "unicode": "e653", + "unicode_decimal": 58963 + }, + { + "icon_id": "24855823", + "name": "search", + "font_class": "search", + "unicode": "e654", + "unicode_decimal": 58964 + }, + { + "icon_id": "24855824", + "name": "redo-filled", + "font_class": "redo-filled", + "unicode": "e655", + "unicode_decimal": 58965 + }, + { + "icon_id": "24841702", + "name": "list", + "font_class": "list", + "unicode": "e644", + "unicode_decimal": 58948 + }, + { + "icon_id": "24841489", + "name": "mail-open-filled", + "font_class": "mail-open-filled", + "unicode": "e63a", + "unicode_decimal": 58938 + }, + { + "icon_id": "24841491", + "name": "hand-thumbsdown-filled", + "font_class": "hand-down-filled", + "unicode": "e63c", + "unicode_decimal": 58940 + }, + { + "icon_id": "24841492", + "name": "hand-thumbsdown", + "font_class": "hand-down", + "unicode": "e63d", + "unicode_decimal": 58941 + }, + { + "icon_id": "24841493", + "name": "hand-thumbsup-filled", + "font_class": "hand-up-filled", + "unicode": "e63e", + "unicode_decimal": 58942 + }, + { + "icon_id": "24841494", + "name": "hand-thumbsup", + "font_class": "hand-up", + "unicode": "e63f", + "unicode_decimal": 58943 + }, + { + "icon_id": "24841496", + "name": "heart-filled", + "font_class": "heart-filled", + "unicode": "e641", + "unicode_decimal": 58945 + }, + { + "icon_id": "24841498", + "name": "mail-open", + "font_class": "mail-open", + "unicode": "e643", + "unicode_decimal": 58947 + }, + { + "icon_id": "24841488", + "name": "heart", + "font_class": "heart", + "unicode": "e639", + "unicode_decimal": 58937 + }, + { + "icon_id": "24839963", + "name": "loop", + "font_class": "loop", + "unicode": "e633", + "unicode_decimal": 58931 + }, + { + "icon_id": "24839866", + "name": "pulldown", + "font_class": "pulldown", + "unicode": "e632", + "unicode_decimal": 58930 + }, + { + "icon_id": "24813798", + "name": "scan", + "font_class": "scan", + "unicode": "e62a", + "unicode_decimal": 58922 + }, + { + "icon_id": "24813786", + "name": "bars", + "font_class": "bars", + "unicode": "e627", + "unicode_decimal": 58919 + }, + { + "icon_id": "24813788", + "name": "cart-filled", + "font_class": "cart-filled", + "unicode": "e629", + "unicode_decimal": 58921 + }, + { + "icon_id": "24813790", + "name": "checkbox", + "font_class": "checkbox", + "unicode": "e62b", + "unicode_decimal": 58923 + }, + { + "icon_id": "24813791", + "name": "checkbox-filled", + "font_class": "checkbox-filled", + "unicode": "e62c", + "unicode_decimal": 58924 + }, + { + "icon_id": "24813794", + "name": "shop", + "font_class": "shop", + "unicode": "e62f", + "unicode_decimal": 58927 + }, + { + "icon_id": "24813795", + "name": "headphones", + "font_class": "headphones", + "unicode": "e630", + "unicode_decimal": 58928 + }, + { + "icon_id": "24813796", + "name": "cart", + "font_class": "cart", + "unicode": "e631", + "unicode_decimal": 58929 + } + ] +} diff --git a/uni_modules/uni-icons/components/uni-icons/uni-icons.vue b/uni_modules/uni-icons/components/uni-icons/uni-icons.vue index 86e74445..8ba3f913 100644 --- a/uni_modules/uni-icons/components/uni-icons/uni-icons.vue +++ b/uni_modules/uni-icons/components/uni-icons/uni-icons.vue @@ -1,96 +1,96 @@ - - - - - + + + + + diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons.css b/uni_modules/uni-icons/components/uni-icons/uniicons.css index 2f56eabd..8e8bff72 100644 --- a/uni_modules/uni-icons/components/uni-icons/uniicons.css +++ b/uni_modules/uni-icons/components/uni-icons/uniicons.css @@ -1,663 +1,663 @@ -.uniui-color:before { - content: "\e6cf"; -} - -.uniui-wallet:before { - content: "\e6b1"; -} - -.uniui-settings-filled:before { - content: "\e6ce"; -} - -.uniui-auth-filled:before { - content: "\e6cc"; -} - -.uniui-shop-filled:before { - content: "\e6cd"; -} - -.uniui-staff-filled:before { - content: "\e6cb"; -} - -.uniui-vip-filled:before { - content: "\e6c6"; -} - -.uniui-plus-filled:before { - content: "\e6c7"; -} - -.uniui-folder-add-filled:before { - content: "\e6c8"; -} - -.uniui-color-filled:before { - content: "\e6c9"; -} - -.uniui-tune-filled:before { - content: "\e6ca"; -} - -.uniui-calendar-filled:before { - content: "\e6c0"; -} - -.uniui-notification-filled:before { - content: "\e6c1"; -} - -.uniui-wallet-filled:before { - content: "\e6c2"; -} - -.uniui-medal-filled:before { - content: "\e6c3"; -} - -.uniui-gift-filled:before { - content: "\e6c4"; -} - -.uniui-fire-filled:before { - content: "\e6c5"; -} - -.uniui-refreshempty:before { - content: "\e6bf"; -} - -.uniui-location-filled:before { - content: "\e6af"; -} - -.uniui-person-filled:before { - content: "\e69d"; -} - -.uniui-personadd-filled:before { - content: "\e698"; -} - -.uniui-back:before { - content: "\e6b9"; -} - -.uniui-forward:before { - content: "\e6ba"; -} - -.uniui-arrow-right:before { - content: "\e6bb"; -} - -.uniui-arrowthinright:before { - content: "\e6bb"; -} - -.uniui-arrow-left:before { - content: "\e6bc"; -} - -.uniui-arrowthinleft:before { - content: "\e6bc"; -} - -.uniui-arrow-up:before { - content: "\e6bd"; -} - -.uniui-arrowthinup:before { - content: "\e6bd"; -} - -.uniui-arrow-down:before { - content: "\e6be"; -} - -.uniui-arrowthindown:before { - content: "\e6be"; -} - -.uniui-bottom:before { - content: "\e6b8"; -} - -.uniui-arrowdown:before { - content: "\e6b8"; -} - -.uniui-right:before { - content: "\e6b5"; -} - -.uniui-arrowright:before { - content: "\e6b5"; -} - -.uniui-top:before { - content: "\e6b6"; -} - -.uniui-arrowup:before { - content: "\e6b6"; -} - -.uniui-left:before { - content: "\e6b7"; -} - -.uniui-arrowleft:before { - content: "\e6b7"; -} - -.uniui-eye:before { - content: "\e651"; -} - -.uniui-eye-filled:before { - content: "\e66a"; -} - -.uniui-eye-slash:before { - content: "\e6b3"; -} - -.uniui-eye-slash-filled:before { - content: "\e6b4"; -} - -.uniui-info-filled:before { - content: "\e649"; -} - -.uniui-reload:before { - content: "\e6b2"; -} - -.uniui-micoff-filled:before { - content: "\e6b0"; -} - -.uniui-map-pin-ellipse:before { - content: "\e6ac"; -} - -.uniui-map-pin:before { - content: "\e6ad"; -} - -.uniui-location:before { - content: "\e6ae"; -} - -.uniui-starhalf:before { - content: "\e683"; -} - -.uniui-star:before { - content: "\e688"; -} - -.uniui-star-filled:before { - content: "\e68f"; -} - -.uniui-calendar:before { - content: "\e6a0"; -} - -.uniui-fire:before { - content: "\e6a1"; -} - -.uniui-medal:before { - content: "\e6a2"; -} - -.uniui-font:before { - content: "\e6a3"; -} - -.uniui-gift:before { - content: "\e6a4"; -} - -.uniui-link:before { - content: "\e6a5"; -} - -.uniui-notification:before { - content: "\e6a6"; -} - -.uniui-staff:before { - content: "\e6a7"; -} - -.uniui-vip:before { - content: "\e6a8"; -} - -.uniui-folder-add:before { - content: "\e6a9"; -} - -.uniui-tune:before { - content: "\e6aa"; -} - -.uniui-auth:before { - content: "\e6ab"; -} - -.uniui-person:before { - content: "\e699"; -} - -.uniui-email-filled:before { - content: "\e69a"; -} - -.uniui-phone-filled:before { - content: "\e69b"; -} - -.uniui-phone:before { - content: "\e69c"; -} - -.uniui-email:before { - content: "\e69e"; -} - -.uniui-personadd:before { - content: "\e69f"; -} - -.uniui-chatboxes-filled:before { - content: "\e692"; -} - -.uniui-contact:before { - content: "\e693"; -} - -.uniui-chatbubble-filled:before { - content: "\e694"; -} - -.uniui-contact-filled:before { - content: "\e695"; -} - -.uniui-chatboxes:before { - content: "\e696"; -} - -.uniui-chatbubble:before { - content: "\e697"; -} - -.uniui-upload-filled:before { - content: "\e68e"; -} - -.uniui-upload:before { - content: "\e690"; -} - -.uniui-weixin:before { - content: "\e691"; -} - -.uniui-compose:before { - content: "\e67f"; -} - -.uniui-qq:before { - content: "\e680"; -} - -.uniui-download-filled:before { - content: "\e681"; -} - -.uniui-pyq:before { - content: "\e682"; -} - -.uniui-sound:before { - content: "\e684"; -} - -.uniui-trash-filled:before { - content: "\e685"; -} - -.uniui-sound-filled:before { - content: "\e686"; -} - -.uniui-trash:before { - content: "\e687"; -} - -.uniui-videocam-filled:before { - content: "\e689"; -} - -.uniui-spinner-cycle:before { - content: "\e68a"; -} - -.uniui-weibo:before { - content: "\e68b"; -} - -.uniui-videocam:before { - content: "\e68c"; -} - -.uniui-download:before { - content: "\e68d"; -} - -.uniui-help:before { - content: "\e679"; -} - -.uniui-navigate-filled:before { - content: "\e67a"; -} - -.uniui-plusempty:before { - content: "\e67b"; -} - -.uniui-smallcircle:before { - content: "\e67c"; -} - -.uniui-minus-filled:before { - content: "\e67d"; -} - -.uniui-micoff:before { - content: "\e67e"; -} - -.uniui-closeempty:before { - content: "\e66c"; -} - -.uniui-clear:before { - content: "\e66d"; -} - -.uniui-navigate:before { - content: "\e66e"; -} - -.uniui-minus:before { - content: "\e66f"; -} - -.uniui-image:before { - content: "\e670"; -} - -.uniui-mic:before { - content: "\e671"; -} - -.uniui-paperplane:before { - content: "\e672"; -} - -.uniui-close:before { - content: "\e673"; -} - -.uniui-help-filled:before { - content: "\e674"; -} - -.uniui-paperplane-filled:before { - content: "\e675"; -} - -.uniui-plus:before { - content: "\e676"; -} - -.uniui-mic-filled:before { - content: "\e677"; -} - -.uniui-image-filled:before { - content: "\e678"; -} - -.uniui-locked-filled:before { - content: "\e668"; -} - -.uniui-info:before { - content: "\e669"; -} - -.uniui-locked:before { - content: "\e66b"; -} - -.uniui-camera-filled:before { - content: "\e658"; -} - -.uniui-chat-filled:before { - content: "\e659"; -} - -.uniui-camera:before { - content: "\e65a"; -} - -.uniui-circle:before { - content: "\e65b"; -} - -.uniui-checkmarkempty:before { - content: "\e65c"; -} - -.uniui-chat:before { - content: "\e65d"; -} - -.uniui-circle-filled:before { - content: "\e65e"; -} - -.uniui-flag:before { - content: "\e65f"; -} - -.uniui-flag-filled:before { - content: "\e660"; -} - -.uniui-gear-filled:before { - content: "\e661"; -} - -.uniui-home:before { - content: "\e662"; -} - -.uniui-home-filled:before { - content: "\e663"; -} - -.uniui-gear:before { - content: "\e664"; -} - -.uniui-smallcircle-filled:before { - content: "\e665"; -} - -.uniui-map-filled:before { - content: "\e666"; -} - -.uniui-map:before { - content: "\e667"; -} - -.uniui-refresh-filled:before { - content: "\e656"; -} - -.uniui-refresh:before { - content: "\e657"; -} - -.uniui-cloud-upload:before { - content: "\e645"; -} - -.uniui-cloud-download-filled:before { - content: "\e646"; -} - -.uniui-cloud-download:before { - content: "\e647"; -} - -.uniui-cloud-upload-filled:before { - content: "\e648"; -} - -.uniui-redo:before { - content: "\e64a"; -} - -.uniui-images-filled:before { - content: "\e64b"; -} - -.uniui-undo-filled:before { - content: "\e64c"; -} - -.uniui-more:before { - content: "\e64d"; -} - -.uniui-more-filled:before { - content: "\e64e"; -} - -.uniui-undo:before { - content: "\e64f"; -} - -.uniui-images:before { - content: "\e650"; -} - -.uniui-paperclip:before { - content: "\e652"; -} - -.uniui-settings:before { - content: "\e653"; -} - -.uniui-search:before { - content: "\e654"; -} - -.uniui-redo-filled:before { - content: "\e655"; -} - -.uniui-list:before { - content: "\e644"; -} - -.uniui-mail-open-filled:before { - content: "\e63a"; -} - -.uniui-hand-down-filled:before { - content: "\e63c"; -} - -.uniui-hand-down:before { - content: "\e63d"; -} - -.uniui-hand-up-filled:before { - content: "\e63e"; -} - -.uniui-hand-up:before { - content: "\e63f"; -} - -.uniui-heart-filled:before { - content: "\e641"; -} - -.uniui-mail-open:before { - content: "\e643"; -} - -.uniui-heart:before { - content: "\e639"; -} - -.uniui-loop:before { - content: "\e633"; -} - -.uniui-pulldown:before { - content: "\e632"; -} - -.uniui-scan:before { - content: "\e62a"; -} - -.uniui-bars:before { - content: "\e627"; -} - -.uniui-cart-filled:before { - content: "\e629"; -} - -.uniui-checkbox:before { - content: "\e62b"; -} - -.uniui-checkbox-filled:before { - content: "\e62c"; -} - -.uniui-shop:before { - content: "\e62f"; -} - -.uniui-headphones:before { - content: "\e630"; -} - -.uniui-cart:before { - content: "\e631"; -} +.uniui-color:before { + content: "\e6cf"; +} + +.uniui-wallet:before { + content: "\e6b1"; +} + +.uniui-settings-filled:before { + content: "\e6ce"; +} + +.uniui-auth-filled:before { + content: "\e6cc"; +} + +.uniui-shop-filled:before { + content: "\e6cd"; +} + +.uniui-staff-filled:before { + content: "\e6cb"; +} + +.uniui-vip-filled:before { + content: "\e6c6"; +} + +.uniui-plus-filled:before { + content: "\e6c7"; +} + +.uniui-folder-add-filled:before { + content: "\e6c8"; +} + +.uniui-color-filled:before { + content: "\e6c9"; +} + +.uniui-tune-filled:before { + content: "\e6ca"; +} + +.uniui-calendar-filled:before { + content: "\e6c0"; +} + +.uniui-notification-filled:before { + content: "\e6c1"; +} + +.uniui-wallet-filled:before { + content: "\e6c2"; +} + +.uniui-medal-filled:before { + content: "\e6c3"; +} + +.uniui-gift-filled:before { + content: "\e6c4"; +} + +.uniui-fire-filled:before { + content: "\e6c5"; +} + +.uniui-refreshempty:before { + content: "\e6bf"; +} + +.uniui-location-filled:before { + content: "\e6af"; +} + +.uniui-person-filled:before { + content: "\e69d"; +} + +.uniui-personadd-filled:before { + content: "\e698"; +} + +.uniui-back:before { + content: "\e6b9"; +} + +.uniui-forward:before { + content: "\e6ba"; +} + +.uniui-arrow-right:before { + content: "\e6bb"; +} + +.uniui-arrowthinright:before { + content: "\e6bb"; +} + +.uniui-arrow-left:before { + content: "\e6bc"; +} + +.uniui-arrowthinleft:before { + content: "\e6bc"; +} + +.uniui-arrow-up:before { + content: "\e6bd"; +} + +.uniui-arrowthinup:before { + content: "\e6bd"; +} + +.uniui-arrow-down:before { + content: "\e6be"; +} + +.uniui-arrowthindown:before { + content: "\e6be"; +} + +.uniui-bottom:before { + content: "\e6b8"; +} + +.uniui-arrowdown:before { + content: "\e6b8"; +} + +.uniui-right:before { + content: "\e6b5"; +} + +.uniui-arrowright:before { + content: "\e6b5"; +} + +.uniui-top:before { + content: "\e6b6"; +} + +.uniui-arrowup:before { + content: "\e6b6"; +} + +.uniui-left:before { + content: "\e6b7"; +} + +.uniui-arrowleft:before { + content: "\e6b7"; +} + +.uniui-eye:before { + content: "\e651"; +} + +.uniui-eye-filled:before { + content: "\e66a"; +} + +.uniui-eye-slash:before { + content: "\e6b3"; +} + +.uniui-eye-slash-filled:before { + content: "\e6b4"; +} + +.uniui-info-filled:before { + content: "\e649"; +} + +.uniui-reload:before { + content: "\e6b2"; +} + +.uniui-micoff-filled:before { + content: "\e6b0"; +} + +.uniui-map-pin-ellipse:before { + content: "\e6ac"; +} + +.uniui-map-pin:before { + content: "\e6ad"; +} + +.uniui-location:before { + content: "\e6ae"; +} + +.uniui-starhalf:before { + content: "\e683"; +} + +.uniui-star:before { + content: "\e688"; +} + +.uniui-star-filled:before { + content: "\e68f"; +} + +.uniui-calendar:before { + content: "\e6a0"; +} + +.uniui-fire:before { + content: "\e6a1"; +} + +.uniui-medal:before { + content: "\e6a2"; +} + +.uniui-font:before { + content: "\e6a3"; +} + +.uniui-gift:before { + content: "\e6a4"; +} + +.uniui-link:before { + content: "\e6a5"; +} + +.uniui-notification:before { + content: "\e6a6"; +} + +.uniui-staff:before { + content: "\e6a7"; +} + +.uniui-vip:before { + content: "\e6a8"; +} + +.uniui-folder-add:before { + content: "\e6a9"; +} + +.uniui-tune:before { + content: "\e6aa"; +} + +.uniui-auth:before { + content: "\e6ab"; +} + +.uniui-person:before { + content: "\e699"; +} + +.uniui-email-filled:before { + content: "\e69a"; +} + +.uniui-phone-filled:before { + content: "\e69b"; +} + +.uniui-phone:before { + content: "\e69c"; +} + +.uniui-email:before { + content: "\e69e"; +} + +.uniui-personadd:before { + content: "\e69f"; +} + +.uniui-chatboxes-filled:before { + content: "\e692"; +} + +.uniui-contact:before { + content: "\e693"; +} + +.uniui-chatbubble-filled:before { + content: "\e694"; +} + +.uniui-contact-filled:before { + content: "\e695"; +} + +.uniui-chatboxes:before { + content: "\e696"; +} + +.uniui-chatbubble:before { + content: "\e697"; +} + +.uniui-upload-filled:before { + content: "\e68e"; +} + +.uniui-upload:before { + content: "\e690"; +} + +.uniui-weixin:before { + content: "\e691"; +} + +.uniui-compose:before { + content: "\e67f"; +} + +.uniui-qq:before { + content: "\e680"; +} + +.uniui-download-filled:before { + content: "\e681"; +} + +.uniui-pyq:before { + content: "\e682"; +} + +.uniui-sound:before { + content: "\e684"; +} + +.uniui-trash-filled:before { + content: "\e685"; +} + +.uniui-sound-filled:before { + content: "\e686"; +} + +.uniui-trash:before { + content: "\e687"; +} + +.uniui-videocam-filled:before { + content: "\e689"; +} + +.uniui-spinner-cycle:before { + content: "\e68a"; +} + +.uniui-weibo:before { + content: "\e68b"; +} + +.uniui-videocam:before { + content: "\e68c"; +} + +.uniui-download:before { + content: "\e68d"; +} + +.uniui-help:before { + content: "\e679"; +} + +.uniui-navigate-filled:before { + content: "\e67a"; +} + +.uniui-plusempty:before { + content: "\e67b"; +} + +.uniui-smallcircle:before { + content: "\e67c"; +} + +.uniui-minus-filled:before { + content: "\e67d"; +} + +.uniui-micoff:before { + content: "\e67e"; +} + +.uniui-closeempty:before { + content: "\e66c"; +} + +.uniui-clear:before { + content: "\e66d"; +} + +.uniui-navigate:before { + content: "\e66e"; +} + +.uniui-minus:before { + content: "\e66f"; +} + +.uniui-image:before { + content: "\e670"; +} + +.uniui-mic:before { + content: "\e671"; +} + +.uniui-paperplane:before { + content: "\e672"; +} + +.uniui-close:before { + content: "\e673"; +} + +.uniui-help-filled:before { + content: "\e674"; +} + +.uniui-paperplane-filled:before { + content: "\e675"; +} + +.uniui-plus:before { + content: "\e676"; +} + +.uniui-mic-filled:before { + content: "\e677"; +} + +.uniui-image-filled:before { + content: "\e678"; +} + +.uniui-locked-filled:before { + content: "\e668"; +} + +.uniui-info:before { + content: "\e669"; +} + +.uniui-locked:before { + content: "\e66b"; +} + +.uniui-camera-filled:before { + content: "\e658"; +} + +.uniui-chat-filled:before { + content: "\e659"; +} + +.uniui-camera:before { + content: "\e65a"; +} + +.uniui-circle:before { + content: "\e65b"; +} + +.uniui-checkmarkempty:before { + content: "\e65c"; +} + +.uniui-chat:before { + content: "\e65d"; +} + +.uniui-circle-filled:before { + content: "\e65e"; +} + +.uniui-flag:before { + content: "\e65f"; +} + +.uniui-flag-filled:before { + content: "\e660"; +} + +.uniui-gear-filled:before { + content: "\e661"; +} + +.uniui-home:before { + content: "\e662"; +} + +.uniui-home-filled:before { + content: "\e663"; +} + +.uniui-gear:before { + content: "\e664"; +} + +.uniui-smallcircle-filled:before { + content: "\e665"; +} + +.uniui-map-filled:before { + content: "\e666"; +} + +.uniui-map:before { + content: "\e667"; +} + +.uniui-refresh-filled:before { + content: "\e656"; +} + +.uniui-refresh:before { + content: "\e657"; +} + +.uniui-cloud-upload:before { + content: "\e645"; +} + +.uniui-cloud-download-filled:before { + content: "\e646"; +} + +.uniui-cloud-download:before { + content: "\e647"; +} + +.uniui-cloud-upload-filled:before { + content: "\e648"; +} + +.uniui-redo:before { + content: "\e64a"; +} + +.uniui-images-filled:before { + content: "\e64b"; +} + +.uniui-undo-filled:before { + content: "\e64c"; +} + +.uniui-more:before { + content: "\e64d"; +} + +.uniui-more-filled:before { + content: "\e64e"; +} + +.uniui-undo:before { + content: "\e64f"; +} + +.uniui-images:before { + content: "\e650"; +} + +.uniui-paperclip:before { + content: "\e652"; +} + +.uniui-settings:before { + content: "\e653"; +} + +.uniui-search:before { + content: "\e654"; +} + +.uniui-redo-filled:before { + content: "\e655"; +} + +.uniui-list:before { + content: "\e644"; +} + +.uniui-mail-open-filled:before { + content: "\e63a"; +} + +.uniui-hand-down-filled:before { + content: "\e63c"; +} + +.uniui-hand-down:before { + content: "\e63d"; +} + +.uniui-hand-up-filled:before { + content: "\e63e"; +} + +.uniui-hand-up:before { + content: "\e63f"; +} + +.uniui-heart-filled:before { + content: "\e641"; +} + +.uniui-mail-open:before { + content: "\e643"; +} + +.uniui-heart:before { + content: "\e639"; +} + +.uniui-loop:before { + content: "\e633"; +} + +.uniui-pulldown:before { + content: "\e632"; +} + +.uniui-scan:before { + content: "\e62a"; +} + +.uniui-bars:before { + content: "\e627"; +} + +.uniui-cart-filled:before { + content: "\e629"; +} + +.uniui-checkbox:before { + content: "\e62b"; +} + +.uniui-checkbox-filled:before { + content: "\e62c"; +} + +.uniui-shop:before { + content: "\e62f"; +} + +.uniui-headphones:before { + content: "\e630"; +} + +.uniui-cart:before { + content: "\e631"; +} diff --git a/uni_modules/uni-icons/package.json b/uni_modules/uni-icons/package.json index d1c4e77d..4d2fd0dd 100644 --- a/uni_modules/uni-icons/package.json +++ b/uni_modules/uni-icons/package.json @@ -1,86 +1,86 @@ -{ - "id": "uni-icons", - "displayName": "uni-icons 图标", - "version": "1.3.5", - "description": "图标组件,用于展示移动端常见的图标,可自定义颜色、大小。", - "keywords": [ - "uni-ui", - "uniui", - "icon", - "图标" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "^3.2.14" - }, - "directories": { - "example": "../../temps/example_temps" - }, - "dcloudext": { - "category": [ - "前端组件", - "通用组件" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" - }, - "uni_modules": { - "dependencies": ["uni-scss"], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "App": { - "app-vue": "y", - "app-nvue": "y" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" - }, - "快应用": { - "华为": "u", - "联盟": "u" - }, - "Vue": { - "vue2": "y", - "vue3": "y" - } - } - } - } +{ + "id": "uni-icons", + "displayName": "uni-icons 图标", + "version": "1.3.5", + "description": "图标组件,用于展示移动端常见的图标,可自定义颜色、大小。", + "keywords": [ + "uni-ui", + "uniui", + "icon", + "图标" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.2.14" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } } \ No newline at end of file diff --git a/uni_modules/uni-icons/readme.md b/uni_modules/uni-icons/readme.md index 86234ba1..72096e31 100644 --- a/uni_modules/uni-icons/readme.md +++ b/uni_modules/uni-icons/readme.md @@ -1,8 +1,8 @@ -## Icons 图标 -> **组件名:uni-icons** -> 代码块: `uIcons` - -用于展示 icons 图标 。 - -### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-icons) -#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 +## Icons 图标 +> **组件名:uni-icons** +> 代码块: `uIcons` + +用于展示 icons 图标 。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-icons) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 diff --git a/uni_modules/uni-link/changelog.md b/uni_modules/uni-link/changelog.md index 2cfbf591..f3e2fd1e 100644 --- a/uni_modules/uni-link/changelog.md +++ b/uni_modules/uni-link/changelog.md @@ -1,17 +1,17 @@ -## 1.0.0(2021-11-19) -- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) -- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-link](https://uniapp.dcloud.io/component/uniui/uni-link) -## 1.1.7(2021-11-08) -## 0.0.7(2021-09-03) -- 修复 在 nvue 下不显示的 bug -## 0.0.6(2021-07-30) -- 新增 支持自定义插槽 -## 0.0.5(2021-06-21) -- 新增 download 属性,H5平台下载文件名 -## 0.0.4(2021-05-12) -- 新增 组件示例地址 -## 0.0.3(2021-03-09) -- 新增 href 属性支持 tel:|mailto: - -## 0.0.2(2021-02-05) -- 调整为uni_modules目录规范 +## 1.0.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-link](https://uniapp.dcloud.io/component/uniui/uni-link) +## 1.1.7(2021-11-08) +## 0.0.7(2021-09-03) +- 修复 在 nvue 下不显示的 bug +## 0.0.6(2021-07-30) +- 新增 支持自定义插槽 +## 0.0.5(2021-06-21) +- 新增 download 属性,H5平台下载文件名 +## 0.0.4(2021-05-12) +- 新增 组件示例地址 +## 0.0.3(2021-03-09) +- 新增 href 属性支持 tel:|mailto: + +## 0.0.2(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-link/components/uni-link/uni-link.vue b/uni_modules/uni-link/components/uni-link/uni-link.vue index 27c5468e..8d720039 100644 --- a/uni_modules/uni-link/components/uni-link/uni-link.vue +++ b/uni_modules/uni-link/components/uni-link/uni-link.vue @@ -1,128 +1,128 @@ - - - - - + + + + + diff --git a/uni_modules/uni-link/package.json b/uni_modules/uni-link/package.json index 77b19865..3e994711 100644 --- a/uni_modules/uni-link/package.json +++ b/uni_modules/uni-link/package.json @@ -1,87 +1,87 @@ -{ - "id": "uni-link", - "displayName": "uni-link 超链接", - "version": "1.0.0", - "description": "uni-link是一个外部网页超链接组件,在小程序内复制url,在app内打开外部浏览器,在h5端打", - "keywords": [ - "uni-ui", - "uniui", - "link", - "超链接", - "" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "" - }, - "directories": { - "example": "../../temps/example_temps" - }, - "dcloudext": { - "category": [ - "前端组件", - "通用组件" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" - }, - "uni_modules": { - "dependencies": ["uni-scss"], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "App": { - "app-vue": "y", - "app-nvue": "y" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" - }, - "快应用": { - "华为": "y", - "联盟": "y" - }, - "Vue": { - "vue2": "y", - "vue3": "y" - } - } - } - } +{ + "id": "uni-link", + "displayName": "uni-link 超链接", + "version": "1.0.0", + "description": "uni-link是一个外部网页超链接组件,在小程序内复制url,在app内打开外部浏览器,在h5端打", + "keywords": [ + "uni-ui", + "uniui", + "link", + "超链接", + "" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "y", + "联盟": "y" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } } \ No newline at end of file diff --git a/uni_modules/uni-link/readme.md b/uni_modules/uni-link/readme.md index 7f09e941..af18b7d9 100644 --- a/uni_modules/uni-link/readme.md +++ b/uni_modules/uni-link/readme.md @@ -1,11 +1,11 @@ - - -## Link 链接 -> **组件名:uni-link** -> 代码块: `uLink` - - -uni-link是一个外部网页超链接组件,在小程序内复制url,在app内打开外部浏览器,在h5端打开新网页。 - -### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-link) + + +## Link 链接 +> **组件名:uni-link** +> 代码块: `uLink` + + +uni-link是一个外部网页超链接组件,在小程序内复制url,在app内打开外部浏览器,在h5端打开新网页。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-link) #### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-list/changelog.md b/uni_modules/uni-list/changelog.md index 6aa6e4e0..181b0724 100644 --- a/uni_modules/uni-list/changelog.md +++ b/uni_modules/uni-list/changelog.md @@ -1,20 +1,20 @@ -## 1.2.1(2022-03-30) -- 删除无用文件 -## 1.2.0(2021-11-23) -- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) -- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-list](https://uniapp.dcloud.io/component/uniui/uni-list) -## 1.1.3(2021-08-30) -- 修复 在vue3中to属性在发行应用的时候报错的bug -## 1.1.2(2021-07-30) -- 优化 vue3下事件警告的问题 -## 1.1.1(2021-07-21) -- 修复 与其他组件嵌套使用时,点击失效的Bug -## 1.1.0(2021-07-13) -- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -## 1.0.17(2021-05-12) -- 新增 组件示例地址 -## 1.0.16(2021-02-05) -- 优化 组件引用关系,通过uni_modules引用组件 -## 1.0.15(2021-02-05) -- 调整为uni_modules目录规范 -- 修复 uni-list-chat 角标显示不正常的问题 +## 1.2.1(2022-03-30) +- 删除无用文件 +## 1.2.0(2021-11-23) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-list](https://uniapp.dcloud.io/component/uniui/uni-list) +## 1.1.3(2021-08-30) +- 修复 在vue3中to属性在发行应用的时候报错的bug +## 1.1.2(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.1.1(2021-07-21) +- 修复 与其他组件嵌套使用时,点击失效的Bug +## 1.1.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.17(2021-05-12) +- 新增 组件示例地址 +## 1.0.16(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 +## 1.0.15(2021-02-05) +- 调整为uni_modules目录规范 +- 修复 uni-list-chat 角标显示不正常的问题 diff --git a/uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue b/uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue index b9349c29..d145b549 100644 --- a/uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue +++ b/uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue @@ -1,107 +1,107 @@ - - - - - + + + + + diff --git a/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss b/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss index 311f8d9f..f5a036fc 100644 --- a/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss +++ b/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss @@ -1,58 +1,58 @@ -/** - * 这里是 uni-list 组件内置的常用样式变量 - * 如果需要覆盖样式,这里提供了基本的组件样式变量,您可以尝试修改这里的变量,去完成样式替换,而不用去修改源码 - * - */ - -// 背景色 -$background-color : #fff; -// 分割线颜色 -$divide-line-color : #e5e5e5; - -// 默认头像大小,如需要修改此值,注意同步修改 js 中的值 const avatarWidth = xx ,目前只支持方形头像 -// nvue 页面不支持修改头像大小 -$avatar-width : 45px ; - -// 头像边框 -$avatar-border-radius: 5px; -$avatar-border-color: #eee; -$avatar-border-width: 1px; - -// 标题文字样式 -$title-size : 16px; -$title-color : #3b4144; -$title-weight : normal; - -// 描述文字样式 -$note-size : 12px; -$note-color : #999; -$note-weight : normal; - -// 右侧额外内容默认样式 -$right-text-size : 12px; -$right-text-color : #999; -$right-text-weight : normal; - -// 角标样式 -// nvue 页面不支持修改圆点位置以及大小 -// 角标在左侧时,角标的位置,默认为 0 ,负数左/下移动,正数右/上移动 -$badge-left: 0px; -$badge-top: 0px; - -// 显示圆点时,圆点大小 -$dot-width: 10px; -$dot-height: 10px; - -// 显示角标时,角标大小和字体大小 -$badge-size : 18px; -$badge-font : 12px; -// 显示角标时,角标前景色 -$badge-color : #fff; -// 显示角标时,角标背景色 -$badge-background-color : #ff5a5f; -// 显示角标时,角标左右间距 -$badge-space : 6px; - -// 状态样式 -// 选中颜色 -$hover : #f5f5f5; +/** + * 这里是 uni-list 组件内置的常用样式变量 + * 如果需要覆盖样式,这里提供了基本的组件样式变量,您可以尝试修改这里的变量,去完成样式替换,而不用去修改源码 + * + */ + +// 背景色 +$background-color : #fff; +// 分割线颜色 +$divide-line-color : #e5e5e5; + +// 默认头像大小,如需要修改此值,注意同步修改 js 中的值 const avatarWidth = xx ,目前只支持方形头像 +// nvue 页面不支持修改头像大小 +$avatar-width : 45px ; + +// 头像边框 +$avatar-border-radius: 5px; +$avatar-border-color: #eee; +$avatar-border-width: 1px; + +// 标题文字样式 +$title-size : 16px; +$title-color : #3b4144; +$title-weight : normal; + +// 描述文字样式 +$note-size : 12px; +$note-color : #999; +$note-weight : normal; + +// 右侧额外内容默认样式 +$right-text-size : 12px; +$right-text-color : #999; +$right-text-weight : normal; + +// 角标样式 +// nvue 页面不支持修改圆点位置以及大小 +// 角标在左侧时,角标的位置,默认为 0 ,负数左/下移动,正数右/上移动 +$badge-left: 0px; +$badge-top: 0px; + +// 显示圆点时,圆点大小 +$dot-width: 10px; +$dot-height: 10px; + +// 显示角标时,角标大小和字体大小 +$badge-size : 18px; +$badge-font : 12px; +// 显示角标时,角标前景色 +$badge-color : #fff; +// 显示角标时,角标背景色 +$badge-background-color : #ff5a5f; +// 显示角标时,角标左右间距 +$badge-space : 6px; + +// 状态样式 +// 选中颜色 +$hover : #f5f5f5; diff --git a/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue b/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue index 2b310085..04e56b82 100644 --- a/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue +++ b/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue @@ -1,538 +1,538 @@ - - - - - + + + + + diff --git a/uni_modules/uni-list/components/uni-list-item/uni-list-item.vue b/uni_modules/uni-list/components/uni-list-item/uni-list-item.vue index fa2ab6f1..98959d7f 100644 --- a/uni_modules/uni-list/components/uni-list-item/uni-list-item.vue +++ b/uni_modules/uni-list/components/uni-list-item/uni-list-item.vue @@ -1,473 +1,473 @@ - - - - - + + + + + diff --git a/uni_modules/uni-list/components/uni-list/uni-list.vue b/uni_modules/uni-list/components/uni-list/uni-list.vue index 85103f20..783bc9da 100644 --- a/uni_modules/uni-list/components/uni-list/uni-list.vue +++ b/uni_modules/uni-list/components/uni-list/uni-list.vue @@ -1,108 +1,108 @@ - - - - + + + + diff --git a/uni_modules/uni-list/components/uni-list/uni-refresh.vue b/uni_modules/uni-list/components/uni-list/uni-refresh.vue index 3b4c5a23..2c64158a 100644 --- a/uni_modules/uni-list/components/uni-list/uni-refresh.vue +++ b/uni_modules/uni-list/components/uni-list/uni-refresh.vue @@ -1,65 +1,65 @@ - - - - - + + + + + diff --git a/uni_modules/uni-list/components/uni-list/uni-refresh.wxs b/uni_modules/uni-list/components/uni-list/uni-refresh.wxs index 818a6b72..9ef364e0 100644 --- a/uni_modules/uni-list/components/uni-list/uni-refresh.wxs +++ b/uni_modules/uni-list/components/uni-list/uni-refresh.wxs @@ -1,87 +1,87 @@ -var pullDown = { - threshold: 95, - maxHeight: 200, - callRefresh: 'onrefresh', - callPullingDown: 'onpullingdown', - refreshSelector: '.uni-refresh' -}; - -function ready(newValue, oldValue, ownerInstance, instance) { - var state = instance.getState() - state.canPullDown = newValue; - // console.log(newValue); -} - -function touchStart(e, instance) { - var state = instance.getState(); - state.refreshInstance = instance.selectComponent(pullDown.refreshSelector); - state.canPullDown = (state.refreshInstance != null && state.refreshInstance != undefined); - if (!state.canPullDown) { - return - } - - // console.log("touchStart"); - - state.height = 0; - state.touchStartY = e.touches[0].pageY || e.changedTouches[0].pageY; - state.refreshInstance.setStyle({ - 'height': 0 - }); - state.refreshInstance.callMethod("onchange", true); -} - -function touchMove(e, ownerInstance) { - var instance = e.instance; - var state = instance.getState(); - if (!state.canPullDown) { - return - } - - var oldHeight = state.height; - var endY = e.touches[0].pageY || e.changedTouches[0].pageY; - var height = endY - state.touchStartY; - if (height > pullDown.maxHeight) { - return; - } - - var refreshInstance = state.refreshInstance; - refreshInstance.setStyle({ - 'height': height + 'px' - }); - - height = height < pullDown.maxHeight ? height : pullDown.maxHeight; - state.height = height; - refreshInstance.callMethod(pullDown.callPullingDown, { - height: height - }); -} - -function touchEnd(e, ownerInstance) { - var state = e.instance.getState(); - if (!state.canPullDown) { - return - } - - state.refreshInstance.callMethod("onchange", false); - - var refreshInstance = state.refreshInstance; - if (state.height > pullDown.threshold) { - refreshInstance.callMethod(pullDown.callRefresh); - return; - } - - refreshInstance.setStyle({ - 'height': 0 - }); -} - -function propObserver(newValue, oldValue, instance) { - pullDown = newValue; -} - -module.exports = { - touchmove: touchMove, - touchstart: touchStart, - touchend: touchEnd, - propObserver: propObserver -} +var pullDown = { + threshold: 95, + maxHeight: 200, + callRefresh: 'onrefresh', + callPullingDown: 'onpullingdown', + refreshSelector: '.uni-refresh' +}; + +function ready(newValue, oldValue, ownerInstance, instance) { + var state = instance.getState() + state.canPullDown = newValue; + // console.log(newValue); +} + +function touchStart(e, instance) { + var state = instance.getState(); + state.refreshInstance = instance.selectComponent(pullDown.refreshSelector); + state.canPullDown = (state.refreshInstance != null && state.refreshInstance != undefined); + if (!state.canPullDown) { + return + } + + // console.log("touchStart"); + + state.height = 0; + state.touchStartY = e.touches[0].pageY || e.changedTouches[0].pageY; + state.refreshInstance.setStyle({ + 'height': 0 + }); + state.refreshInstance.callMethod("onchange", true); +} + +function touchMove(e, ownerInstance) { + var instance = e.instance; + var state = instance.getState(); + if (!state.canPullDown) { + return + } + + var oldHeight = state.height; + var endY = e.touches[0].pageY || e.changedTouches[0].pageY; + var height = endY - state.touchStartY; + if (height > pullDown.maxHeight) { + return; + } + + var refreshInstance = state.refreshInstance; + refreshInstance.setStyle({ + 'height': height + 'px' + }); + + height = height < pullDown.maxHeight ? height : pullDown.maxHeight; + state.height = height; + refreshInstance.callMethod(pullDown.callPullingDown, { + height: height + }); +} + +function touchEnd(e, ownerInstance) { + var state = e.instance.getState(); + if (!state.canPullDown) { + return + } + + state.refreshInstance.callMethod("onchange", false); + + var refreshInstance = state.refreshInstance; + if (state.height > pullDown.threshold) { + refreshInstance.callMethod(pullDown.callRefresh); + return; + } + + refreshInstance.setStyle({ + 'height': 0 + }); +} + +function propObserver(newValue, oldValue, instance) { + pullDown = newValue; +} + +module.exports = { + touchmove: touchMove, + touchstart: touchStart, + touchend: touchEnd, + propObserver: propObserver +} diff --git a/uni_modules/uni-list/package.json b/uni_modules/uni-list/package.json index 66e8bef0..80230a51 100644 --- a/uni_modules/uni-list/package.json +++ b/uni_modules/uni-list/package.json @@ -1,91 +1,91 @@ -{ - "id": "uni-list", - "displayName": "uni-list 列表", - "version": "1.2.1", - "description": "List 组件 ,帮助使用者快速构建列表。", - "keywords": [ - "", - "uni-ui", - "uniui", - "列表", - "", - "list" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "" - }, - "directories": { - "example": "../../temps/example_temps" - }, - "dcloudext": { - "category": [ - "前端组件", - "通用组件" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" - }, - "uni_modules": { - "dependencies": [ - "uni-badge", - "uni-icons" - ], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "App": { - "app-vue": "y", - "app-nvue": "y" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" - }, - "快应用": { - "华为": "u", - "联盟": "u" - }, - "Vue": { - "vue2": "y", - "vue3": "y" - } - } - } - } +{ + "id": "uni-list", + "displayName": "uni-list 列表", + "version": "1.2.1", + "description": "List 组件 ,帮助使用者快速构建列表。", + "keywords": [ + "", + "uni-ui", + "uniui", + "列表", + "", + "list" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [ + "uni-badge", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } } \ No newline at end of file diff --git a/uni_modules/uni-list/readme.md b/uni_modules/uni-list/readme.md index 32c28654..a6c058b9 100644 --- a/uni_modules/uni-list/readme.md +++ b/uni_modules/uni-list/readme.md @@ -1,346 +1,346 @@ -## List 列表 -> **组件名:uni-list** -> 代码块: `uList`、`uListItem` -> 关联组件:`uni-list-item`、`uni-badge`、`uni-icons`、`uni-list-chat`、`uni-list-ad` - - -List 列表组件,包含基本列表样式、可扩展插槽机制、长列表性能优化、多端兼容。 - -在vue页面里,它默认使用页面级滚动。在app-nvue页面里,它默认使用原生list组件滚动。这样的长列表,在滚动出屏幕外后,系统会回收不可见区域的渲染内存资源,不会造成滚动越长手机越卡的问题。 - -uni-list组件是父容器,里面的核心是uni-list-item子组件,它代表列表中的一个可重复行,子组件可以无限循环。 - -uni-list-item有很多风格,uni-list-item组件通过内置的属性,满足一些常用的场景。当内置属性不满足需求时,可以通过扩展插槽来自定义列表内容。 - -内置属性可以覆盖的场景包括:导航列表、设置列表、小图标列表、通信录列表、聊天记录列表。 - -涉及很多大图或丰富内容的列表,比如类今日头条的新闻列表、类淘宝的电商列表,需要通过扩展插槽实现。 - -下文均有样例给出。 - -uni-list不包含下拉刷新和上拉翻页。上拉翻页另见组件:[uni-load-more](https://ext.dcloud.net.cn/plugin?id=29) - - -### 安装方式 - -本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 - -如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) - -> **注意事项** -> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。 -> - 组件需要依赖 `sass` 插件 ,请自行手动安装 -> - 组件内部依赖 `'uni-icons'` 、`uni-badge` 组件 -> - `uni-list` 和 `uni-list-item` 需要配套使用,暂不支持单独使用 `uni-list-item` -> - 只有开启点击反馈后,会有点击选中效果 -> - 使用插槽时,可以完全自定义内容 -> - note 、rightText 属性暂时没做限制,不支持文字溢出隐藏,使用时应该控制长度显示或通过默认插槽自行扩展 -> - 支付宝小程序平台需要在支付宝小程序开发者工具里开启 component2 编译模式,开启方式: 详情 --> 项目配置 --> 启用 component2 编译 -> - 如果需要修改 `switch`、`badge` 样式,请使用插槽自定义 -> - 在 `HBuilderX` 低版本中,可能会出现组件显示 `undefined` 的问题,请升级最新的 `HBuilderX` 或者 `cli` -> - 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 - - -### 基本用法 - -- 设置 `title` 属性,可以显示列表标题 -- 设置 `disabled` 属性,可以禁用当前项 - -```html - - - - - -``` - -### 多行内容显示 - -- 设置 `note` 属性 ,可以在第二行显示描述文本信息 - -```html - - - - - -``` - -### 右侧显示角标、switch - -- 设置 `show-badge` 属性 ,可以显示角标内容 -- 设置 `show-switch` 属性,可以显示 switch 开关 - -```html - - - - - -``` - -### 左侧显示略缩图、图标 - -- 设置 `thumb` 属性 ,可以在列表左侧显示略缩图 -- 设置 `show-extra-icon` 属性,并指定 `extra-icon` 可以在左侧显示图标 - -```html - - - - -``` - -### 开启点击反馈和右侧箭头 -- 设置 `clickable` 为 `true` ,则表示这是一个可点击的列表,会默认给一个点击效果,并可以监听 `click` 事件 -- 设置 `link` 属性,会自动开启点击反馈,并给列表右侧添加一个箭头 -- 设置 `to` 属性,可以跳转页面,`link` 的值表示跳转方式,如果不指定,默认为 `navigateTo` - -```html - - - - - - - -``` - - -### 聊天列表示例 -- 设置 `clickable` 为 `true` ,则表示这是一个可点击的列表,会默认给一个点击效果,并可以监听 `click` 事件 -- 设置 `link` 属性,会自动开启点击反馈,`link` 的值表示跳转方式,如果不指定,默认为 `navigateTo` -- 设置 `to` 属性,可以跳转页面 -- `time` 属性,通常会设置成时间显示,但是这个属性不仅仅可以设置时间,你可以传入任何文本,注意文本长度可能会影响显示 -- `avatar` 和 `avatarList` 属性同时只会有一个生效,同时设置的话,`avatarList` 属性的长度大于1 ,`avatar` 属性将失效 -- 可以通过默认插槽自定义列表右侧内容 - -```html - - - - - - - - - - - - - - - - - 刚刚 - - - - - - - -``` - -```javascript - -export default { - components: {}, - data() { - return { - avatarList: [{ - url: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png' - }, { - url: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png' - }, { - url: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png' - }] - } - } -} - -``` - - -```css - -.chat-custom-right { - flex: 1; - /* #ifndef APP-NVUE */ - display: flex; - /* #endif */ - flex-direction: column; - justify-content: space-between; - align-items: flex-end; -} - -.chat-custom-text { - font-size: 12px; - color: #999; -} - -``` - -## API - -### List Props - -属性名 |类型 |默认值 | 说明 -:-: |:-: |:-: | :-: -border |Boolean |true | 是否显示边框 - - -### ListItem Props - -属性名 |类型 |默认值 | 说明 -:-: |:-: |:-: | :-: -title |String |- | 标题 -note |String |- | 描述 -ellipsis |Number |0 | title 是否溢出隐藏,可选值,0:默认; 1:显示一行; 2:显示两行;【nvue 暂不支持】 -thumb |String |- | 左侧缩略图,若thumb有值,则不会显示扩展图标 -thumbSize |String |medium | 略缩图尺寸,可选值,lg:大图; medium:一般; sm:小图; -showBadge |Boolean |false | 是否显示数字角标 -badgeText |String |- | 数字角标内容 -badgeType |String |- | 数字角标类型,参考[uni-icons](https://ext.dcloud.net.cn/plugin?id=21) -badgeStyle |Object |- | 数字角标样式,使用uni-badge的custom-style参数 -rightText |String |- | 右侧文字内容 -disabled |Boolean |false | 是否禁用 -showArrow |Boolean |true | 是否显示箭头图标 -link |String |navigateTo | 新页面跳转方式,可选值见下表 -to |String |- | 新页面跳转地址,如填写此属性,click 会返回页面是否跳转成功 -clickable |Boolean |false | 是否开启点击反馈 -showSwitch |Boolean |false | 是否显示Switch -switchChecked |Boolean |false | Switch是否被选中 -showExtraIcon |Boolean |false | 左侧是否显示扩展图标 -extraIcon |Object |- | 扩展图标参数,格式为 ``{color: '#4cd964',size: '22',type: 'spinner'}``,参考 [uni-icons](https://ext.dcloud.net.cn/plugin?id=28) -direction | String |row | 排版方向,可选值,row:水平排列; column:垂直排列; 3个插槽是水平排还是垂直排,也受此属性控制 - - -#### Link Options - -属性名 | 说明 -:-: | :-: -navigateTo | 同 uni.navigateTo() -redirectTo | 同 uni.reLaunch() -reLaunch | 同 uni.reLaunch() -switchTab | 同 uni.switchTab() - -### ListItem Events - -事件称名 |说明 |返回参数 -:-: |:-: |:-: -click |点击 uniListItem 触发事件,需开启点击反馈 |- -switchChange |点击切换 Switch 时触发,需显示 switch |e={value:checked} - - - -### ListItem Slots - -名称 | 说明 -:-: | :-: -header | 左/上内容插槽,可完全自定义默认显示 -body | 中间内容插槽,可完全自定义中间内容 -footer | 右/下内容插槽,可完全自定义右侧内容 - - -> **通过插槽扩展** -> 需要注意的是当使用插槽时,内置样式将会失效,只保留排版样式,此时的样式需要开发者自己实现 -> 如果 `uni-list-item` 组件内置属性样式无法满足需求,可以使用插槽来自定义uni-list-item里的内容。 -> uni-list-item提供了3个可扩展的插槽:`header`、`body`、`footer` -> - 当 `direction` 属性为 `row` 时表示水平排列,此时 `header` 表示列表的左边部分,`body` 表示列表的中间部分,`footer` 表示列表的右边部分 -> - 当 `direction` 属性为 `column` 时表示垂直排列,此时 `header` 表示列表的上边部分,`body` 表示列表的中间部分,`footer` 表示列表的下边部分 -> 开发者可以只用1个插槽,也可以3个一起使用。在插槽中可自主编写view标签,实现自己所需的效果。 - - -**示例** - -```html - - - - - - - - - 自定义插槽 - - - - -``` - - - - - -### ListItemChat Props - -属性名 |类型 |默认值 | 说明 -:-: |:-: |:-: | :-: -title |String |- | 标题 -note |String |- | 描述 -clickable |Boolean |false | 是否开启点击反馈 -badgeText |String |- | 数字角标内容,设置为 `dot` 将显示圆点 -badgePositon |String |right | 角标位置 -link |String |navigateTo | 是否展示右侧箭头并开启点击反馈,可选值见下表 -clickable |Boolean |false | 是否开启点击反馈 -to |String |- | 跳转页面地址,如填写此属性,click 会返回页面是否跳转成功 -time |String |- | 右侧时间显示 -avatarCircle |Boolean |false | 是否显示圆形头像 -avatar |String |- | 头像地址,avatarCircle 不填时生效 -avatarList |Array |- | 头像组,格式为 [{url:''}] - -#### Link Options - -属性名 | 说明 -:-: | :-: -navigateTo | 同 uni.navigateTo() -redirectTo | 同 uni.reLaunch() -reLaunch | 同 uni.reLaunch() -switchTab | 同 uni.switchTab() - -### ListItemChat Slots - -名称 | 说明 -:- | :- -default | 自定义列表右侧内容(包括时间和角标显示) - -### ListItemChat Events -事件称名 | 说明 | 返回参数 -:-: | :-: | :-: -@click | 点击 uniListChat 触发事件 | {data:{}} ,如有 to 属性,会返回页面跳转信息 - - - - - - -## 基于uni-list扩展的页面模板 - -通过扩展插槽,可实现多种常见样式的列表 - -**新闻列表类** - -1. 云端一体混合布局:[https://ext.dcloud.net.cn/plugin?id=2546](https://ext.dcloud.net.cn/plugin?id=2546) -2. 云端一体垂直布局,大图模式:[https://ext.dcloud.net.cn/plugin?id=2583](https://ext.dcloud.net.cn/plugin?id=2583) -3. 云端一体垂直布局,多行图文混排:[https://ext.dcloud.net.cn/plugin?id=2584](https://ext.dcloud.net.cn/plugin?id=2584) -4. 云端一体垂直布局,多图模式:[https://ext.dcloud.net.cn/plugin?id=2585](https://ext.dcloud.net.cn/plugin?id=2585) -5. 云端一体水平布局,左图右文:[https://ext.dcloud.net.cn/plugin?id=2586](https://ext.dcloud.net.cn/plugin?id=2586) -6. 云端一体水平布局,左文右图:[https://ext.dcloud.net.cn/plugin?id=2587](https://ext.dcloud.net.cn/plugin?id=2587) -7. 云端一体垂直布局,无图模式,主标题+副标题:[https://ext.dcloud.net.cn/plugin?id=2588](https://ext.dcloud.net.cn/plugin?id=2588) - -**商品列表类** - -1. 云端一体列表/宫格视图互切:[https://ext.dcloud.net.cn/plugin?id=2651](https://ext.dcloud.net.cn/plugin?id=2651) -2. 云端一体列表(宫格模式):[https://ext.dcloud.net.cn/plugin?id=2671](https://ext.dcloud.net.cn/plugin?id=2671) -3. 云端一体列表(列表模式):[https://ext.dcloud.net.cn/plugin?id=2672](https://ext.dcloud.net.cn/plugin?id=2672) - -## 组件示例 - +## List 列表 +> **组件名:uni-list** +> 代码块: `uList`、`uListItem` +> 关联组件:`uni-list-item`、`uni-badge`、`uni-icons`、`uni-list-chat`、`uni-list-ad` + + +List 列表组件,包含基本列表样式、可扩展插槽机制、长列表性能优化、多端兼容。 + +在vue页面里,它默认使用页面级滚动。在app-nvue页面里,它默认使用原生list组件滚动。这样的长列表,在滚动出屏幕外后,系统会回收不可见区域的渲染内存资源,不会造成滚动越长手机越卡的问题。 + +uni-list组件是父容器,里面的核心是uni-list-item子组件,它代表列表中的一个可重复行,子组件可以无限循环。 + +uni-list-item有很多风格,uni-list-item组件通过内置的属性,满足一些常用的场景。当内置属性不满足需求时,可以通过扩展插槽来自定义列表内容。 + +内置属性可以覆盖的场景包括:导航列表、设置列表、小图标列表、通信录列表、聊天记录列表。 + +涉及很多大图或丰富内容的列表,比如类今日头条的新闻列表、类淘宝的电商列表,需要通过扩展插槽实现。 + +下文均有样例给出。 + +uni-list不包含下拉刷新和上拉翻页。上拉翻页另见组件:[uni-load-more](https://ext.dcloud.net.cn/plugin?id=29) + + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 + +如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + +> **注意事项** +> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。 +> - 组件需要依赖 `sass` 插件 ,请自行手动安装 +> - 组件内部依赖 `'uni-icons'` 、`uni-badge` 组件 +> - `uni-list` 和 `uni-list-item` 需要配套使用,暂不支持单独使用 `uni-list-item` +> - 只有开启点击反馈后,会有点击选中效果 +> - 使用插槽时,可以完全自定义内容 +> - note 、rightText 属性暂时没做限制,不支持文字溢出隐藏,使用时应该控制长度显示或通过默认插槽自行扩展 +> - 支付宝小程序平台需要在支付宝小程序开发者工具里开启 component2 编译模式,开启方式: 详情 --> 项目配置 --> 启用 component2 编译 +> - 如果需要修改 `switch`、`badge` 样式,请使用插槽自定义 +> - 在 `HBuilderX` 低版本中,可能会出现组件显示 `undefined` 的问题,请升级最新的 `HBuilderX` 或者 `cli` +> - 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + +### 基本用法 + +- 设置 `title` 属性,可以显示列表标题 +- 设置 `disabled` 属性,可以禁用当前项 + +```html + + + + + +``` + +### 多行内容显示 + +- 设置 `note` 属性 ,可以在第二行显示描述文本信息 + +```html + + + + + +``` + +### 右侧显示角标、switch + +- 设置 `show-badge` 属性 ,可以显示角标内容 +- 设置 `show-switch` 属性,可以显示 switch 开关 + +```html + + + + + +``` + +### 左侧显示略缩图、图标 + +- 设置 `thumb` 属性 ,可以在列表左侧显示略缩图 +- 设置 `show-extra-icon` 属性,并指定 `extra-icon` 可以在左侧显示图标 + +```html + + + + +``` + +### 开启点击反馈和右侧箭头 +- 设置 `clickable` 为 `true` ,则表示这是一个可点击的列表,会默认给一个点击效果,并可以监听 `click` 事件 +- 设置 `link` 属性,会自动开启点击反馈,并给列表右侧添加一个箭头 +- 设置 `to` 属性,可以跳转页面,`link` 的值表示跳转方式,如果不指定,默认为 `navigateTo` + +```html + + + + + + + +``` + + +### 聊天列表示例 +- 设置 `clickable` 为 `true` ,则表示这是一个可点击的列表,会默认给一个点击效果,并可以监听 `click` 事件 +- 设置 `link` 属性,会自动开启点击反馈,`link` 的值表示跳转方式,如果不指定,默认为 `navigateTo` +- 设置 `to` 属性,可以跳转页面 +- `time` 属性,通常会设置成时间显示,但是这个属性不仅仅可以设置时间,你可以传入任何文本,注意文本长度可能会影响显示 +- `avatar` 和 `avatarList` 属性同时只会有一个生效,同时设置的话,`avatarList` 属性的长度大于1 ,`avatar` 属性将失效 +- 可以通过默认插槽自定义列表右侧内容 + +```html + + + + + + + + + + + + + + + + + 刚刚 + + + + + + + +``` + +```javascript + +export default { + components: {}, + data() { + return { + avatarList: [{ + url: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png' + }, { + url: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png' + }, { + url: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png' + }] + } + } +} + +``` + + +```css + +.chat-custom-right { + flex: 1; + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: column; + justify-content: space-between; + align-items: flex-end; +} + +.chat-custom-text { + font-size: 12px; + color: #999; +} + +``` + +## API + +### List Props + +属性名 |类型 |默认值 | 说明 +:-: |:-: |:-: | :-: +border |Boolean |true | 是否显示边框 + + +### ListItem Props + +属性名 |类型 |默认值 | 说明 +:-: |:-: |:-: | :-: +title |String |- | 标题 +note |String |- | 描述 +ellipsis |Number |0 | title 是否溢出隐藏,可选值,0:默认; 1:显示一行; 2:显示两行;【nvue 暂不支持】 +thumb |String |- | 左侧缩略图,若thumb有值,则不会显示扩展图标 +thumbSize |String |medium | 略缩图尺寸,可选值,lg:大图; medium:一般; sm:小图; +showBadge |Boolean |false | 是否显示数字角标 +badgeText |String |- | 数字角标内容 +badgeType |String |- | 数字角标类型,参考[uni-icons](https://ext.dcloud.net.cn/plugin?id=21) +badgeStyle |Object |- | 数字角标样式,使用uni-badge的custom-style参数 +rightText |String |- | 右侧文字内容 +disabled |Boolean |false | 是否禁用 +showArrow |Boolean |true | 是否显示箭头图标 +link |String |navigateTo | 新页面跳转方式,可选值见下表 +to |String |- | 新页面跳转地址,如填写此属性,click 会返回页面是否跳转成功 +clickable |Boolean |false | 是否开启点击反馈 +showSwitch |Boolean |false | 是否显示Switch +switchChecked |Boolean |false | Switch是否被选中 +showExtraIcon |Boolean |false | 左侧是否显示扩展图标 +extraIcon |Object |- | 扩展图标参数,格式为 ``{color: '#4cd964',size: '22',type: 'spinner'}``,参考 [uni-icons](https://ext.dcloud.net.cn/plugin?id=28) +direction | String |row | 排版方向,可选值,row:水平排列; column:垂直排列; 3个插槽是水平排还是垂直排,也受此属性控制 + + +#### Link Options + +属性名 | 说明 +:-: | :-: +navigateTo | 同 uni.navigateTo() +redirectTo | 同 uni.reLaunch() +reLaunch | 同 uni.reLaunch() +switchTab | 同 uni.switchTab() + +### ListItem Events + +事件称名 |说明 |返回参数 +:-: |:-: |:-: +click |点击 uniListItem 触发事件,需开启点击反馈 |- +switchChange |点击切换 Switch 时触发,需显示 switch |e={value:checked} + + + +### ListItem Slots + +名称 | 说明 +:-: | :-: +header | 左/上内容插槽,可完全自定义默认显示 +body | 中间内容插槽,可完全自定义中间内容 +footer | 右/下内容插槽,可完全自定义右侧内容 + + +> **通过插槽扩展** +> 需要注意的是当使用插槽时,内置样式将会失效,只保留排版样式,此时的样式需要开发者自己实现 +> 如果 `uni-list-item` 组件内置属性样式无法满足需求,可以使用插槽来自定义uni-list-item里的内容。 +> uni-list-item提供了3个可扩展的插槽:`header`、`body`、`footer` +> - 当 `direction` 属性为 `row` 时表示水平排列,此时 `header` 表示列表的左边部分,`body` 表示列表的中间部分,`footer` 表示列表的右边部分 +> - 当 `direction` 属性为 `column` 时表示垂直排列,此时 `header` 表示列表的上边部分,`body` 表示列表的中间部分,`footer` 表示列表的下边部分 +> 开发者可以只用1个插槽,也可以3个一起使用。在插槽中可自主编写view标签,实现自己所需的效果。 + + +**示例** + +```html + + + + + + + + + 自定义插槽 + + + + +``` + + + + + +### ListItemChat Props + +属性名 |类型 |默认值 | 说明 +:-: |:-: |:-: | :-: +title |String |- | 标题 +note |String |- | 描述 +clickable |Boolean |false | 是否开启点击反馈 +badgeText |String |- | 数字角标内容,设置为 `dot` 将显示圆点 +badgePositon |String |right | 角标位置 +link |String |navigateTo | 是否展示右侧箭头并开启点击反馈,可选值见下表 +clickable |Boolean |false | 是否开启点击反馈 +to |String |- | 跳转页面地址,如填写此属性,click 会返回页面是否跳转成功 +time |String |- | 右侧时间显示 +avatarCircle |Boolean |false | 是否显示圆形头像 +avatar |String |- | 头像地址,avatarCircle 不填时生效 +avatarList |Array |- | 头像组,格式为 [{url:''}] + +#### Link Options + +属性名 | 说明 +:-: | :-: +navigateTo | 同 uni.navigateTo() +redirectTo | 同 uni.reLaunch() +reLaunch | 同 uni.reLaunch() +switchTab | 同 uni.switchTab() + +### ListItemChat Slots + +名称 | 说明 +:- | :- +default | 自定义列表右侧内容(包括时间和角标显示) + +### ListItemChat Events +事件称名 | 说明 | 返回参数 +:-: | :-: | :-: +@click | 点击 uniListChat 触发事件 | {data:{}} ,如有 to 属性,会返回页面跳转信息 + + + + + + +## 基于uni-list扩展的页面模板 + +通过扩展插槽,可实现多种常见样式的列表 + +**新闻列表类** + +1. 云端一体混合布局:[https://ext.dcloud.net.cn/plugin?id=2546](https://ext.dcloud.net.cn/plugin?id=2546) +2. 云端一体垂直布局,大图模式:[https://ext.dcloud.net.cn/plugin?id=2583](https://ext.dcloud.net.cn/plugin?id=2583) +3. 云端一体垂直布局,多行图文混排:[https://ext.dcloud.net.cn/plugin?id=2584](https://ext.dcloud.net.cn/plugin?id=2584) +4. 云端一体垂直布局,多图模式:[https://ext.dcloud.net.cn/plugin?id=2585](https://ext.dcloud.net.cn/plugin?id=2585) +5. 云端一体水平布局,左图右文:[https://ext.dcloud.net.cn/plugin?id=2586](https://ext.dcloud.net.cn/plugin?id=2586) +6. 云端一体水平布局,左文右图:[https://ext.dcloud.net.cn/plugin?id=2587](https://ext.dcloud.net.cn/plugin?id=2587) +7. 云端一体垂直布局,无图模式,主标题+副标题:[https://ext.dcloud.net.cn/plugin?id=2588](https://ext.dcloud.net.cn/plugin?id=2588) + +**商品列表类** + +1. 云端一体列表/宫格视图互切:[https://ext.dcloud.net.cn/plugin?id=2651](https://ext.dcloud.net.cn/plugin?id=2651) +2. 云端一体列表(宫格模式):[https://ext.dcloud.net.cn/plugin?id=2671](https://ext.dcloud.net.cn/plugin?id=2671) +3. 云端一体列表(列表模式):[https://ext.dcloud.net.cn/plugin?id=2672](https://ext.dcloud.net.cn/plugin?id=2672) + +## 组件示例 + 点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/list/list](https://hellouniapp.dcloud.net.cn/pages/extUI/list/list) \ No newline at end of file diff --git a/uni_modules/uni-load-more/changelog.md b/uni_modules/uni-load-more/changelog.md index 8f03f1d5..548a6e50 100644 --- a/uni_modules/uni-load-more/changelog.md +++ b/uni_modules/uni-load-more/changelog.md @@ -1,19 +1,19 @@ -## 1.3.3(2022-01-20) -- 新增 showText属性 ,是否显示文本 -## 1.3.2(2022-01-19) -- 修复 nvue 平台下不显示文本的bug -## 1.3.1(2022-01-19) -- 修复 微信小程序平台样式选择器报警告的问题 -## 1.3.0(2021-11-19) -- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) -- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-load-more](https://uniapp.dcloud.io/component/uniui/uni-load-more) -## 1.2.1(2021-08-24) -- 新增 支持国际化 -## 1.2.0(2021-07-30) -- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -## 1.1.8(2021-05-12) -- 新增 组件示例地址 -## 1.1.7(2021-03-30) -- 修复 uni-load-more 在首页使用时,h5 平台报 'uni is not defined' 的 bug -## 1.1.6(2021-02-05) -- 调整为uni_modules目录规范 +## 1.3.3(2022-01-20) +- 新增 showText属性 ,是否显示文本 +## 1.3.2(2022-01-19) +- 修复 nvue 平台下不显示文本的bug +## 1.3.1(2022-01-19) +- 修复 微信小程序平台样式选择器报警告的问题 +## 1.3.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-load-more](https://uniapp.dcloud.io/component/uniui/uni-load-more) +## 1.2.1(2021-08-24) +- 新增 支持国际化 +## 1.2.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.8(2021-05-12) +- 新增 组件示例地址 +## 1.1.7(2021-03-30) +- 修复 uni-load-more 在首页使用时,h5 平台报 'uni is not defined' 的 bug +## 1.1.6(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json index a4f14a54..44adc91d 100644 --- a/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json @@ -1,5 +1,5 @@ -{ - "uni-load-more.contentdown": "Pull up to show more", - "uni-load-more.contentrefresh": "loading...", - "uni-load-more.contentnomore": "No more data" -} +{ + "uni-load-more.contentdown": "Pull up to show more", + "uni-load-more.contentrefresh": "loading...", + "uni-load-more.contentnomore": "No more data" +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js b/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js index de7509c8..d2afd081 100644 --- a/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js @@ -1,8 +1,8 @@ -import en from './en.json' -import zhHans from './zh-Hans.json' -import zhHant from './zh-Hant.json' -export default { - en, - 'zh-Hans': zhHans, - 'zh-Hant': zhHant -} +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json index f15d5105..7fdda0a2 100644 --- a/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json @@ -1,5 +1,5 @@ -{ - "uni-load-more.contentdown": "上拉显示更多", - "uni-load-more.contentrefresh": "正在加载...", - "uni-load-more.contentnomore": "没有更多数据了" -} +{ + "uni-load-more.contentdown": "上拉显示更多", + "uni-load-more.contentrefresh": "正在加载...", + "uni-load-more.contentnomore": "没有更多数据了" +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json index a255c6de..f0586ef0 100644 --- a/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json @@ -1,5 +1,5 @@ -{ - "uni-load-more.contentdown": "上拉顯示更多", - "uni-load-more.contentrefresh": "正在加載...", - "uni-load-more.contentnomore": "沒有更多數據了" -} +{ + "uni-load-more.contentdown": "上拉顯示更多", + "uni-load-more.contentrefresh": "正在加載...", + "uni-load-more.contentnomore": "沒有更多數據了" +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue b/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue index e5eff4d6..59a3db85 100644 --- a/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue +++ b/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue @@ -1,399 +1,399 @@ - - - - - + + + + + diff --git a/uni_modules/uni-load-more/package.json b/uni_modules/uni-load-more/package.json index 2fa6f040..d723ef1d 100644 --- a/uni_modules/uni-load-more/package.json +++ b/uni_modules/uni-load-more/package.json @@ -1,86 +1,86 @@ -{ - "id": "uni-load-more", - "displayName": "uni-load-more 加载更多", - "version": "1.3.3", - "description": "LoadMore 组件,常用在列表里面,做滚动加载使用。", - "keywords": [ - "uni-ui", - "uniui", - "加载更多", - "load-more" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "" - }, - "directories": { - "example": "../../temps/example_temps" - }, - "dcloudext": { - "category": [ - "前端组件", - "通用组件" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" - }, - "uni_modules": { - "dependencies": ["uni-scss"], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "App": { - "app-vue": "y", - "app-nvue": "y" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" - }, - "快应用": { - "华为": "u", - "联盟": "u" - }, - "Vue": { - "vue2": "y", - "vue3": "y" - } - } - } - } +{ + "id": "uni-load-more", + "displayName": "uni-load-more 加载更多", + "version": "1.3.3", + "description": "LoadMore 组件,常用在列表里面,做滚动加载使用。", + "keywords": [ + "uni-ui", + "uniui", + "加载更多", + "load-more" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } } \ No newline at end of file diff --git a/uni_modules/uni-load-more/readme.md b/uni_modules/uni-load-more/readme.md index 54dc1fad..1925a577 100644 --- a/uni_modules/uni-load-more/readme.md +++ b/uni_modules/uni-load-more/readme.md @@ -1,14 +1,14 @@ - - -### LoadMore 加载更多 -> **组件名:uni-load-more** -> 代码块: `uLoadMore` - - -用于列表中,做滚动加载使用,展示 loading 的各种状态。 - - -### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-load-more) -#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 - - + + +### LoadMore 加载更多 +> **组件名:uni-load-more** +> 代码块: `uLoadMore` + + +用于列表中,做滚动加载使用,展示 loading 的各种状态。 + + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-load-more) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-nav-bar/changelog.md b/uni_modules/uni-nav-bar/changelog.md index c2d841b6..4d00aa2e 100644 --- a/uni_modules/uni-nav-bar/changelog.md +++ b/uni_modules/uni-nav-bar/changelog.md @@ -1,39 +1,39 @@ -## 1.3.5(2022-05-24) -- 新增 stat 属性 ,可开启统计title 上报 ,仅使用了title 属性且项目开启了uni统计生效 -## 1.3.4(2022-01-24) -- 更新 组件示例 -## 1.3.3(2022-01-24) -- 新增 left-width/right-width属性 ,可修改左右两侧的宽度 -## 1.3.2(2022-01-18) -- 修复 在vue下,标题不垂直居中的bug -## 1.3.1(2022-01-18) -- 修复 height 属性类型错误 -## 1.3.0(2022-01-18) -- 新增 height 属性,可修改组件高度 -- 新增 dark 属性可可开启暗黑模式 -- 优化 标题字数过多显示省略号 -- 优化 插槽,插入内容可完全覆盖 -## 1.2.1(2022-01-10) -- 修复 color 属性不生效的bug -## 1.2.0(2021-11-19) -- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) -- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-nav-bar](https://uniapp.dcloud.io/component/uniui/uni-nav-bar) -## 1.1.0(2021-07-30) -- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -## 1.0.11(2021-05-12) -- 新增 组件示例地址 -## 1.0.10(2021-04-30) -- 修复 在nvue下fixed为true,宽度不能撑满的Bug -## 1.0.9(2021-04-21) -- 优化 添加依赖 uni-icons, 导入后自动下载依赖 -## 1.0.8(2021-04-14) -- uni-ui 修复 uni-nav-bar 当 fixed 属性为 true 时铺不满屏幕的 bug - -## 1.0.7(2021-02-25) -- 修复 easycom 下,找不到 uni-status-bar 的bug - -## 1.0.6(2021-02-05) -- 优化 组件引用关系,通过uni_modules引用组件 - -## 1.0.5(2021-02-05) -- 调整为uni_modules目录规范 +## 1.3.5(2022-05-24) +- 新增 stat 属性 ,可开启统计title 上报 ,仅使用了title 属性且项目开启了uni统计生效 +## 1.3.4(2022-01-24) +- 更新 组件示例 +## 1.3.3(2022-01-24) +- 新增 left-width/right-width属性 ,可修改左右两侧的宽度 +## 1.3.2(2022-01-18) +- 修复 在vue下,标题不垂直居中的bug +## 1.3.1(2022-01-18) +- 修复 height 属性类型错误 +## 1.3.0(2022-01-18) +- 新增 height 属性,可修改组件高度 +- 新增 dark 属性可可开启暗黑模式 +- 优化 标题字数过多显示省略号 +- 优化 插槽,插入内容可完全覆盖 +## 1.2.1(2022-01-10) +- 修复 color 属性不生效的bug +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-nav-bar](https://uniapp.dcloud.io/component/uniui/uni-nav-bar) +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.11(2021-05-12) +- 新增 组件示例地址 +## 1.0.10(2021-04-30) +- 修复 在nvue下fixed为true,宽度不能撑满的Bug +## 1.0.9(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 1.0.8(2021-04-14) +- uni-ui 修复 uni-nav-bar 当 fixed 属性为 true 时铺不满屏幕的 bug + +## 1.0.7(2021-02-25) +- 修复 easycom 下,找不到 uni-status-bar 的bug + +## 1.0.6(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.5(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue b/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue index cbfc1685..4a46b870 100644 --- a/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue +++ b/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue @@ -1,348 +1,348 @@ - - - - - + + + + + diff --git a/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue b/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue index 6a688744..75ce5410 100644 --- a/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue +++ b/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue @@ -1,27 +1,27 @@ - - - - - + + + + + diff --git a/uni_modules/uni-nav-bar/package.json b/uni_modules/uni-nav-bar/package.json index a69ed4f1..e87ae8ec 100644 --- a/uni_modules/uni-nav-bar/package.json +++ b/uni_modules/uni-nav-bar/package.json @@ -1,89 +1,89 @@ -{ - "id": "uni-nav-bar", - "displayName": "uni-nav-bar 自定义导航栏", - "version": "1.3.5", - "description": "自定义导航栏组件,主要用于头部导航。", - "keywords": [ - "uni-ui", - "导航", - "导航栏", - "自定义导航栏" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "" - }, - "directories": { - "example": "../../temps/example_temps" - }, - "dcloudext": { - "category": [ - "前端组件", - "通用组件" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" - }, - "uni_modules": { - "dependencies": [ - "uni-scss", - "uni-icons" - ], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "App": { - "app-vue": "y", - "app-nvue": "y" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" - }, - "快应用": { - "华为": "u", - "联盟": "u" - }, - "Vue": { - "vue2": "y", - "vue3": "y" - } - } - } - } +{ + "id": "uni-nav-bar", + "displayName": "uni-nav-bar 自定义导航栏", + "version": "1.3.5", + "description": "自定义导航栏组件,主要用于头部导航。", + "keywords": [ + "uni-ui", + "导航", + "导航栏", + "自定义导航栏" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } } \ No newline at end of file diff --git a/uni_modules/uni-nav-bar/readme.md b/uni_modules/uni-nav-bar/readme.md index 3934b327..47db1d0a 100644 --- a/uni_modules/uni-nav-bar/readme.md +++ b/uni_modules/uni-nav-bar/readme.md @@ -1,15 +1,15 @@ - - -## NavBar 导航栏 -> **组件名:uni-nav-bar** -> 代码块: `uNavBar` - -导航栏组件,主要用于头部导航。 - -### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-nav-bar) -#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 - - - - - + + +## NavBar 导航栏 +> **组件名:uni-nav-bar** +> 代码块: `uNavBar` + +导航栏组件,主要用于头部导航。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-nav-bar) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + + + + diff --git a/uni_modules/uni-notice-bar/changelog.md b/uni_modules/uni-notice-bar/changelog.md index 9ee75a01..5233e69f 100644 --- a/uni_modules/uni-notice-bar/changelog.md +++ b/uni_modules/uni-notice-bar/changelog.md @@ -1,16 +1,16 @@ -## 1.2.0(2021-11-19) -- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) -- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-notice-bar](https://uniapp.dcloud.io/component/uniui/uni-notice-bar) -## 1.1.1(2021-11-09) -- 新增 提供组件设计资源,组件样式调整 -## 1.1.0(2021-07-30) -- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -## 1.0.9(2021-05-12) -- 新增 组件示例地址 -## 1.0.8(2021-04-21) -- 优化 添加依赖 uni-icons, 导入后自动下载依赖 -## 1.0.7(2021-02-05) -- 优化 组件引用关系,通过uni_modules引用组件 - -## 1.0.6(2021-02-05) -- 调整为uni_modules目录规范 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-notice-bar](https://uniapp.dcloud.io/component/uniui/uni-notice-bar) +## 1.1.1(2021-11-09) +- 新增 提供组件设计资源,组件样式调整 +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.9(2021-05-12) +- 新增 组件示例地址 +## 1.0.8(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 1.0.7(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.6(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue b/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue index 424430da..cbae1361 100644 --- a/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue +++ b/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue @@ -1,395 +1,395 @@ - - - - - + + + + + diff --git a/uni_modules/uni-notice-bar/package.json b/uni_modules/uni-notice-bar/package.json index 97719a0f..62cf8c5a 100644 --- a/uni_modules/uni-notice-bar/package.json +++ b/uni_modules/uni-notice-bar/package.json @@ -1,90 +1,90 @@ -{ - "id": "uni-notice-bar", - "displayName": "uni-notice-bar 通告栏", - "version": "1.2.0", - "description": "NoticeBar 通告栏组件,常用于展示公告信息,可设为滚动公告", - "keywords": [ - "uni-ui", - "uniui", - "通告栏", - "公告", - "跑马灯" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "" - }, - "directories": { - "example": "../../temps/example_temps" - }, - "dcloudext": { - "category": [ - "前端组件", - "通用组件" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" - }, - "uni_modules": { - "dependencies": [ - "uni-scss", - "uni-icons" - ], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "App": { - "app-vue": "y", - "app-nvue": "y" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" - }, - "快应用": { - "华为": "u", - "联盟": "u" - }, - "Vue": { - "vue2": "y", - "vue3": "y" - } - } - } - } -} +{ + "id": "uni-notice-bar", + "displayName": "uni-notice-bar 通告栏", + "version": "1.2.0", + "description": "NoticeBar 通告栏组件,常用于展示公告信息,可设为滚动公告", + "keywords": [ + "uni-ui", + "uniui", + "通告栏", + "公告", + "跑马灯" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-notice-bar/readme.md b/uni_modules/uni-notice-bar/readme.md index fb2ede24..22d230da 100644 --- a/uni_modules/uni-notice-bar/readme.md +++ b/uni_modules/uni-notice-bar/readme.md @@ -1,13 +1,13 @@ - - -## NoticeBar 通告栏 -> **组件名:uni-notice-bar** -> 代码块: `uNoticeBar` - - -通告栏组件 。 - -### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-notice-bar) -#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 - - + + +## NoticeBar 通告栏 +> **组件名:uni-notice-bar** +> 代码块: `uNoticeBar` + + +通告栏组件 。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-notice-bar) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-number-box/changelog.md b/uni_modules/uni-number-box/changelog.md index 5925c32a..9cd5bff1 100644 --- a/uni_modules/uni-number-box/changelog.md +++ b/uni_modules/uni-number-box/changelog.md @@ -1,25 +1,25 @@ -## 1.2.1(2021-11-22) -- 修复 vue3中某些scss变量无法找到的问题 -## 1.2.0(2021-11-19) -- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) -- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-number-box](https://uniapp.dcloud.io/component/uniui/uni-number-box) -## 1.1.2(2021-11-09) -- 新增 提供组件设计资源,组件样式调整 -## 1.1.1(2021-07-30) -- 优化 vue3下事件警告的问题 -## 1.1.0(2021-07-13) -- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -## 1.0.7(2021-05-12) -- 新增 组件示例地址 -## 1.0.6(2021-04-20) -- 修复 uni-number-box 浮点数运算不精确的 bug -- 修复 uni-number-box change 事件触发不正确的 bug -- 新增 uni-number-box v-model 双向绑定 -## 1.0.5(2021-02-05) -- 调整为uni_modules目录规范 - -## 1.0.7(2021-02-05) -- 调整为uni_modules目录规范 -- 新增 支持 v-model -- 新增 支持 focus、blur 事件 -- 新增 支持 PC 端 +## 1.2.1(2021-11-22) +- 修复 vue3中某些scss变量无法找到的问题 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-number-box](https://uniapp.dcloud.io/component/uniui/uni-number-box) +## 1.1.2(2021-11-09) +- 新增 提供组件设计资源,组件样式调整 +## 1.1.1(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.1.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.7(2021-05-12) +- 新增 组件示例地址 +## 1.0.6(2021-04-20) +- 修复 uni-number-box 浮点数运算不精确的 bug +- 修复 uni-number-box change 事件触发不正确的 bug +- 新增 uni-number-box v-model 双向绑定 +## 1.0.5(2021-02-05) +- 调整为uni_modules目录规范 + +## 1.0.7(2021-02-05) +- 调整为uni_modules目录规范 +- 新增 支持 v-model +- 新增 支持 focus、blur 事件 +- 新增 支持 PC 端 diff --git a/uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue b/uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue index 8d255fbb..f3c1748e 100644 --- a/uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue +++ b/uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue @@ -1,220 +1,220 @@ - - - + + + diff --git a/uni_modules/uni-number-box/package.json b/uni_modules/uni-number-box/package.json index ad823368..e774c3f8 100644 --- a/uni_modules/uni-number-box/package.json +++ b/uni_modules/uni-number-box/package.json @@ -1,85 +1,85 @@ -{ - "id": "uni-number-box", - "displayName": "uni-number-box 数字输入框", - "version": "1.2.1", - "description": "NumberBox 带加减按钮的数字输入框组件,用户可以控制每次点击增加的数值,支持小数。", - "keywords": [ - "uni-ui", - "uniui", - "数字输入框" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "" - }, - "directories": { - "example": "../../temps/example_temps" - }, - "dcloudext": { - "category": [ - "前端组件", - "通用组件" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" - }, - "uni_modules": { - "dependencies": ["uni-scss"], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "App": { - "app-vue": "y", - "app-nvue": "y" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" - }, - "快应用": { - "华为": "u", - "联盟": "u" - }, - "Vue": { - "vue2": "y", - "vue3": "y" - } - } - } - } +{ + "id": "uni-number-box", + "displayName": "uni-number-box 数字输入框", + "version": "1.2.1", + "description": "NumberBox 带加减按钮的数字输入框组件,用户可以控制每次点击增加的数值,支持小数。", + "keywords": [ + "uni-ui", + "uniui", + "数字输入框" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } } \ No newline at end of file diff --git a/uni_modules/uni-number-box/readme.md b/uni_modules/uni-number-box/readme.md index affc56fa..9b5d60ad 100644 --- a/uni_modules/uni-number-box/readme.md +++ b/uni_modules/uni-number-box/readme.md @@ -1,13 +1,13 @@ - - -## NumberBox 数字输入框 -> **组件名:uni-number-box** -> 代码块: `uNumberBox` - - -带加减按钮的数字输入框。 - -### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-number-box) -#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 - - + + +## NumberBox 数字输入框 +> **组件名:uni-number-box** +> 代码块: `uNumberBox` + + +带加减按钮的数字输入框。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-number-box) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-rate/changelog.md b/uni_modules/uni-rate/changelog.md index 8a98a612..d57d9162 100644 --- a/uni_modules/uni-rate/changelog.md +++ b/uni_modules/uni-rate/changelog.md @@ -1,25 +1,25 @@ -## 1.3.1(2022-02-25) -- 修复 条件判断 `NaN` 错误的 bug -## 1.3.0(2021-11-19) -- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) -- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-rate](https://uniapp.dcloud.io/component/uniui/uni-rate) -## 1.2.2(2021-09-10) -- 优化 默认值修改为 0 颗星 -## 1.2.1(2021-07-30) -- 优化 vue3下事件警告的问题 -## 1.2.0(2021-07-13) -- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -## 1.1.2(2021-05-12) -- 新增 组件示例地址 -## 1.1.1(2021-04-21) -- 修复 布局变化后 uni-rate 星星计算不准确的 bug -- 优化 添加依赖 uni-icons, 导入 uni-rate 自动下载依赖 -## 1.1.0(2021-04-16) -- 修复 uni-rate 属性 margin 值为 string 组件失效的 bug - -## 1.0.9(2021-02-05) -- 优化 组件引用关系,通过uni_modules引用组件 - -## 1.0.8(2021-02-05) -- 调整为uni_modules目录规范 -- 支持 pc 端 +## 1.3.1(2022-02-25) +- 修复 条件判断 `NaN` 错误的 bug +## 1.3.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-rate](https://uniapp.dcloud.io/component/uniui/uni-rate) +## 1.2.2(2021-09-10) +- 优化 默认值修改为 0 颗星 +## 1.2.1(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.2.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.2(2021-05-12) +- 新增 组件示例地址 +## 1.1.1(2021-04-21) +- 修复 布局变化后 uni-rate 星星计算不准确的 bug +- 优化 添加依赖 uni-icons, 导入 uni-rate 自动下载依赖 +## 1.1.0(2021-04-16) +- 修复 uni-rate 属性 margin 值为 string 组件失效的 bug + +## 1.0.9(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.8(2021-02-05) +- 调整为uni_modules目录规范 +- 支持 pc 端 diff --git a/uni_modules/uni-rate/components/uni-rate/uni-rate.vue b/uni_modules/uni-rate/components/uni-rate/uni-rate.vue index 857f5f9c..9b89d869 100644 --- a/uni_modules/uni-rate/components/uni-rate/uni-rate.vue +++ b/uni_modules/uni-rate/components/uni-rate/uni-rate.vue @@ -1,361 +1,361 @@ - - - - - + + + + + diff --git a/uni_modules/uni-rate/package.json b/uni_modules/uni-rate/package.json index 64e8e332..06eba77e 100644 --- a/uni_modules/uni-rate/package.json +++ b/uni_modules/uni-rate/package.json @@ -1,88 +1,88 @@ -{ - "id": "uni-rate", - "displayName": "uni-rate 评分", - "version": "1.3.1", - "description": "Rate 评分组件,可自定义评分星星图标的大小、间隔、评分数。", - "keywords": [ - "uni-ui", - "uniui", - "评分" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "" - }, - "directories": { - "example": "../../temps/example_temps" - }, - "dcloudext": { - "category": [ - "前端组件", - "通用组件" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" - }, - "uni_modules": { - "dependencies": [ - "uni-scss", - "uni-icons" - ], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "App": { - "app-vue": "y", - "app-nvue": "y" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" - }, - "快应用": { - "华为": "u", - "联盟": "u" - }, - "Vue": { - "vue2": "y", - "vue3": "y" - } - } - } - } -} +{ + "id": "uni-rate", + "displayName": "uni-rate 评分", + "version": "1.3.1", + "description": "Rate 评分组件,可自定义评分星星图标的大小、间隔、评分数。", + "keywords": [ + "uni-ui", + "uniui", + "评分" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-rate/readme.md b/uni_modules/uni-rate/readme.md index eae7b5ce..605391fe 100644 --- a/uni_modules/uni-rate/readme.md +++ b/uni_modules/uni-rate/readme.md @@ -1,12 +1,12 @@ - - -## Rate 评分 -> **组件名:uni-rate** -> 代码块: `uRate` -> 关联组件:`uni-icons` - - -评分组件,多用于购买商品后,对商品进行评价等场景 - -### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-rate) + + +## Rate 评分 +> **组件名:uni-rate** +> 代码块: `uRate` +> 关联组件:`uni-icons` + + +评分组件,多用于购买商品后,对商品进行评价等场景 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-rate) #### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-row/changelog.md b/uni_modules/uni-row/changelog.md index 5b465bc6..23715018 100644 --- a/uni_modules/uni-row/changelog.md +++ b/uni_modules/uni-row/changelog.md @@ -1,10 +1,10 @@ -## 1.0.0(2021-11-19) -- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) -- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-row](https://uniapp.dcloud.io/component/uniui/uni-row) -## 0.1.0(2021-07-13) -- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -## 0.0.4(2021-05-12) -- 新增 组件示例地址 -## 0.0.3(2021-02-05) -- 调整为uni_modules目录规范 -- 新增uni-row组件 +## 1.0.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-row](https://uniapp.dcloud.io/component/uniui/uni-row) +## 0.1.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 0.0.4(2021-05-12) +- 新增 组件示例地址 +## 0.0.3(2021-02-05) +- 调整为uni_modules目录规范 +- 新增uni-row组件 diff --git a/uni_modules/uni-row/components/uni-col/uni-col.vue b/uni_modules/uni-row/components/uni-col/uni-col.vue index 84e2deb4..5b2ecd82 100644 --- a/uni_modules/uni-row/components/uni-col/uni-col.vue +++ b/uni_modules/uni-row/components/uni-col/uni-col.vue @@ -1,317 +1,317 @@ - - - - - + + + + + diff --git a/uni_modules/uni-row/components/uni-row/uni-row.vue b/uni_modules/uni-row/components/uni-row/uni-row.vue index f8e85423..3451cc90 100644 --- a/uni_modules/uni-row/components/uni-row/uni-row.vue +++ b/uni_modules/uni-row/components/uni-row/uni-row.vue @@ -1,190 +1,190 @@ - - - - - + + + + + diff --git a/uni_modules/uni-row/package.json b/uni_modules/uni-row/package.json index 3f52fa64..b09a8d03 100644 --- a/uni_modules/uni-row/package.json +++ b/uni_modules/uni-row/package.json @@ -1,87 +1,87 @@ -{ - "id": "uni-row", - "displayName": "uni-row 布局-行", - "version": "1.0.0", - "description": "流式栅格系统,随着屏幕或视口分为 24 份,可以迅速简便地创建布局。", - "keywords": [ - "uni-ui", - "uniui", - "栅格", - "布局", - "layout" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "" - }, - "directories": { - "example": "../../temps/example_temps" - }, - "dcloudext": { - "category": [ - "前端组件", - "通用组件" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" - }, - "uni_modules": { - "dependencies": ["uni-scss"], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "App": { - "app-vue": "y", - "app-nvue": "y" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" - }, - "快应用": { - "华为": "u", - "联盟": "u" - }, - "Vue": { - "vue2": "y", - "vue3": "u" - } - } - } - } +{ + "id": "uni-row", + "displayName": "uni-row 布局-行", + "version": "1.0.0", + "description": "流式栅格系统,随着屏幕或视口分为 24 份,可以迅速简便地创建布局。", + "keywords": [ + "uni-ui", + "uniui", + "栅格", + "布局", + "layout" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "u" + } + } + } + } } \ No newline at end of file diff --git a/uni_modules/uni-row/readme.md b/uni_modules/uni-row/readme.md index 3c9c8b99..33a959a8 100644 --- a/uni_modules/uni-row/readme.md +++ b/uni_modules/uni-row/readme.md @@ -1,10 +1,10 @@ -## Layout 布局 - -> **组件名 uni-row、uni-col** -> 代码块: `uRow`、`uCol` - - -流式栅格系统,随着屏幕或视口分为 24 份,可以迅速简便地创建布局。 - -### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-row) +## Layout 布局 + +> **组件名 uni-row、uni-col** +> 代码块: `uRow`、`uCol` + + +流式栅格系统,随着屏幕或视口分为 24 份,可以迅速简便地创建布局。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-row) #### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-scss/changelog.md b/uni_modules/uni-scss/changelog.md index b863bb0f..a58bab79 100644 --- a/uni_modules/uni-scss/changelog.md +++ b/uni_modules/uni-scss/changelog.md @@ -1,8 +1,8 @@ -## 1.0.3(2022-01-21) -- 优化 组件示例 -## 1.0.2(2021-11-22) -- 修复 / 符号在 vue 不同版本兼容问题引起的报错问题 -## 1.0.1(2021-11-22) -- 修复 vue3中scss语法兼容问题 -## 1.0.0(2021-11-18) -- init +## 1.0.3(2022-01-21) +- 优化 组件示例 +## 1.0.2(2021-11-22) +- 修复 / 符号在 vue 不同版本兼容问题引起的报错问题 +## 1.0.1(2021-11-22) +- 修复 vue3中scss语法兼容问题 +## 1.0.0(2021-11-18) +- init diff --git a/uni_modules/uni-scss/index.scss b/uni_modules/uni-scss/index.scss index 1744a5f9..5d43f7fa 100644 --- a/uni_modules/uni-scss/index.scss +++ b/uni_modules/uni-scss/index.scss @@ -1 +1 @@ -@import './styles/index.scss'; +@import './styles/index.scss'; diff --git a/uni_modules/uni-scss/manifest.json b/uni_modules/uni-scss/manifest.json index 9f8baee3..2f839da4 100644 --- a/uni_modules/uni-scss/manifest.json +++ b/uni_modules/uni-scss/manifest.json @@ -1,95 +1,95 @@ -{ - "name" : "", - "appid" : "", - "description": "应用描述", - "versionName": "1.0.0", - "versionCode": "100", - "transformPx": false, - /* 5+App特有相关 */ - "app-plus": { - "usingComponents": true, - "splashscreen": { - "alwaysShowBeforeRender": true, - "waiting": true, - "autoclose": true, - "delay": 0 - }, - "modules": { - "OAuth": {}, - "Payment": {}, - "Push": {}, - "Share": {}, - "Speech": {}, - "VideoPlayer": {} - }, - /* 应用发布信息 */ - "distribute": { - /* android打包配置 */ - "android": { - "permissions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - /* ios打包配置 */ - "ios": { - "UIBackgroundModes": ["audio"] - }, - /* SDK配置 */ - "sdkConfigs": { - "speech": { - "ifly": {} - } - }, - "orientation": ["portrait-primary"] - } - }, - /* 快应用特有相关 */ - "quickapp": {}, - /* 小程序特有相关 */ - "mp-weixin": { - "appid": "", - "setting": { - "urlCheck": false - }, - "usingComponents": true - }, - "h5": { - "template": "template.h5.html", - "router": { - "mode": "history", - "base": "/h5/" - } - } -} +{ + "name" : "", + "appid" : "", + "description": "应用描述", + "versionName": "1.0.0", + "versionCode": "100", + "transformPx": false, + /* 5+App特有相关 */ + "app-plus": { + "usingComponents": true, + "splashscreen": { + "alwaysShowBeforeRender": true, + "waiting": true, + "autoclose": true, + "delay": 0 + }, + "modules": { + "OAuth": {}, + "Payment": {}, + "Push": {}, + "Share": {}, + "Speech": {}, + "VideoPlayer": {} + }, + /* 应用发布信息 */ + "distribute": { + /* android打包配置 */ + "android": { + "permissions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + /* ios打包配置 */ + "ios": { + "UIBackgroundModes": ["audio"] + }, + /* SDK配置 */ + "sdkConfigs": { + "speech": { + "ifly": {} + } + }, + "orientation": ["portrait-primary"] + } + }, + /* 快应用特有相关 */ + "quickapp": {}, + /* 小程序特有相关 */ + "mp-weixin": { + "appid": "", + "setting": { + "urlCheck": false + }, + "usingComponents": true + }, + "h5": { + "template": "template.h5.html", + "router": { + "mode": "history", + "base": "/h5/" + } + } +} diff --git a/uni_modules/uni-scss/package.json b/uni_modules/uni-scss/package.json index 7cc0ccb7..4db034b1 100644 --- a/uni_modules/uni-scss/package.json +++ b/uni_modules/uni-scss/package.json @@ -1,82 +1,82 @@ -{ - "id": "uni-scss", - "displayName": "uni-scss 辅助样式", - "version": "1.0.3", - "description": "uni-sass是uni-ui提供的一套全局样式 ,通过一些简单的类名和sass变量,实现简单的页面布局操作,比如颜色、边距、圆角等。", - "keywords": [ - "uni-scss", - "uni-ui", - "辅助样式" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "^3.1.0" - }, - "dcloudext": { - "category": [ - "JS SDK", - "通用 SDK" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" - }, - "uni_modules": { - "dependencies": [], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "App": { - "app-vue": "y", - "app-nvue": "u" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" - }, - "快应用": { - "华为": "n", - "联盟": "n" - }, - "Vue": { - "vue2": "y", - "vue3": "y" - } - } - } - } -} +{ + "id": "uni-scss", + "displayName": "uni-scss 辅助样式", + "version": "1.0.3", + "description": "uni-sass是uni-ui提供的一套全局样式 ,通过一些简单的类名和sass变量,实现简单的页面布局操作,比如颜色、边距、圆角等。", + "keywords": [ + "uni-scss", + "uni-ui", + "辅助样式" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "category": [ + "JS SDK", + "通用 SDK" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "u" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "n", + "联盟": "n" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-scss/readme.md b/uni_modules/uni-scss/readme.md index b7d1c25f..8fa518a6 100644 --- a/uni_modules/uni-scss/readme.md +++ b/uni_modules/uni-scss/readme.md @@ -1,4 +1,4 @@ -`uni-sass` 是 `uni-ui`提供的一套全局样式 ,通过一些简单的类名和`sass`变量,实现简单的页面布局操作,比如颜色、边距、圆角等。 - -### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-sass) +`uni-sass` 是 `uni-ui`提供的一套全局样式 ,通过一些简单的类名和`sass`变量,实现简单的页面布局操作,比如颜色、边距、圆角等。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-sass) #### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/index.scss b/uni_modules/uni-scss/styles/index.scss index ffac4fec..2106dd1a 100644 --- a/uni_modules/uni-scss/styles/index.scss +++ b/uni_modules/uni-scss/styles/index.scss @@ -1,7 +1,7 @@ -@import './setting/_variables.scss'; -@import './setting/_border.scss'; -@import './setting/_color.scss'; -@import './setting/_space.scss'; -@import './setting/_radius.scss'; -@import './setting/_text.scss'; -@import './setting/_styles.scss'; +@import './setting/_variables.scss'; +@import './setting/_border.scss'; +@import './setting/_color.scss'; +@import './setting/_space.scss'; +@import './setting/_radius.scss'; +@import './setting/_text.scss'; +@import './setting/_styles.scss'; diff --git a/uni_modules/uni-scss/styles/setting/_border.scss b/uni_modules/uni-scss/styles/setting/_border.scss index 12a11c32..781df648 100644 --- a/uni_modules/uni-scss/styles/setting/_border.scss +++ b/uni_modules/uni-scss/styles/setting/_border.scss @@ -1,3 +1,3 @@ -.uni-border { - border: 1px $uni-border-1 solid; +.uni-border { + border: 1px $uni-border-1 solid; } \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/setting/_color.scss b/uni_modules/uni-scss/styles/setting/_color.scss index 1ededd94..595f5ede 100644 --- a/uni_modules/uni-scss/styles/setting/_color.scss +++ b/uni_modules/uni-scss/styles/setting/_color.scss @@ -1,66 +1,66 @@ - -// TODO 暂时不需要 class ,需要用户使用变量实现 ,如果使用类名其实并不推荐 -// @mixin get-styles($k,$c) { -// @if $k == size or $k == weight{ -// font-#{$k}:#{$c} -// }@else{ -// #{$k}:#{$c} -// } -// } -$uni-ui-color:( - // 主色 - primary: $uni-primary, - primary-disable: $uni-primary-disable, - primary-light: $uni-primary-light, - // 辅助色 - success: $uni-success, - success-disable: $uni-success-disable, - success-light: $uni-success-light, - warning: $uni-warning, - warning-disable: $uni-warning-disable, - warning-light: $uni-warning-light, - error: $uni-error, - error-disable: $uni-error-disable, - error-light: $uni-error-light, - info: $uni-info, - info-disable: $uni-info-disable, - info-light: $uni-info-light, - // 中性色 - main-color: $uni-main-color, - base-color: $uni-base-color, - secondary-color: $uni-secondary-color, - extra-color: $uni-extra-color, - // 背景色 - bg-color: $uni-bg-color, - // 边框颜色 - border-1: $uni-border-1, - border-2: $uni-border-2, - border-3: $uni-border-3, - border-4: $uni-border-4, - // 黑色 - black:$uni-black, - // 白色 - white:$uni-white, - // 透明 - transparent:$uni-transparent -) !default; -@each $key, $child in $uni-ui-color { - .uni-#{"" + $key} { - color: $child; - } - .uni-#{"" + $key}-bg { - background-color: $child; - } -} -.uni-shadow-sm { - box-shadow: $uni-shadow-sm; -} -.uni-shadow-base { - box-shadow: $uni-shadow-base; -} -.uni-shadow-lg { - box-shadow: $uni-shadow-lg; -} -.uni-mask { - background-color:$uni-mask; -} + +// TODO 暂时不需要 class ,需要用户使用变量实现 ,如果使用类名其实并不推荐 +// @mixin get-styles($k,$c) { +// @if $k == size or $k == weight{ +// font-#{$k}:#{$c} +// }@else{ +// #{$k}:#{$c} +// } +// } +$uni-ui-color:( + // 主色 + primary: $uni-primary, + primary-disable: $uni-primary-disable, + primary-light: $uni-primary-light, + // 辅助色 + success: $uni-success, + success-disable: $uni-success-disable, + success-light: $uni-success-light, + warning: $uni-warning, + warning-disable: $uni-warning-disable, + warning-light: $uni-warning-light, + error: $uni-error, + error-disable: $uni-error-disable, + error-light: $uni-error-light, + info: $uni-info, + info-disable: $uni-info-disable, + info-light: $uni-info-light, + // 中性色 + main-color: $uni-main-color, + base-color: $uni-base-color, + secondary-color: $uni-secondary-color, + extra-color: $uni-extra-color, + // 背景色 + bg-color: $uni-bg-color, + // 边框颜色 + border-1: $uni-border-1, + border-2: $uni-border-2, + border-3: $uni-border-3, + border-4: $uni-border-4, + // 黑色 + black:$uni-black, + // 白色 + white:$uni-white, + // 透明 + transparent:$uni-transparent +) !default; +@each $key, $child in $uni-ui-color { + .uni-#{"" + $key} { + color: $child; + } + .uni-#{"" + $key}-bg { + background-color: $child; + } +} +.uni-shadow-sm { + box-shadow: $uni-shadow-sm; +} +.uni-shadow-base { + box-shadow: $uni-shadow-base; +} +.uni-shadow-lg { + box-shadow: $uni-shadow-lg; +} +.uni-mask { + background-color:$uni-mask; +} diff --git a/uni_modules/uni-scss/styles/setting/_radius.scss b/uni_modules/uni-scss/styles/setting/_radius.scss index 9a0428bb..8672a693 100644 --- a/uni_modules/uni-scss/styles/setting/_radius.scss +++ b/uni_modules/uni-scss/styles/setting/_radius.scss @@ -1,55 +1,55 @@ -@mixin radius($r,$d:null ,$important: false){ - $radius-value:map-get($uni-radius, $r) if($important, !important, null); - // Key exists within the $uni-radius variable - @if (map-has-key($uni-radius, $r) and $d){ - @if $d == t { - border-top-left-radius:$radius-value; - border-top-right-radius:$radius-value; - }@else if $d == r { - border-top-right-radius:$radius-value; - border-bottom-right-radius:$radius-value; - }@else if $d == b { - border-bottom-left-radius:$radius-value; - border-bottom-right-radius:$radius-value; - }@else if $d == l { - border-top-left-radius:$radius-value; - border-bottom-left-radius:$radius-value; - }@else if $d == tl { - border-top-left-radius:$radius-value; - }@else if $d == tr { - border-top-right-radius:$radius-value; - }@else if $d == br { - border-bottom-right-radius:$radius-value; - }@else if $d == bl { - border-bottom-left-radius:$radius-value; - } - }@else{ - border-radius:$radius-value; - } -} - -@each $key, $child in $uni-radius { - @if($key){ - .uni-radius-#{"" + $key} { - @include radius($key) - } - }@else{ - .uni-radius { - @include radius($key) - } - } -} - -@each $direction in t, r, b, l,tl, tr, br, bl { - @each $key, $child in $uni-radius { - @if($key){ - .uni-radius-#{"" + $direction}-#{"" + $key} { - @include radius($key,$direction,false) - } - }@else{ - .uni-radius-#{$direction} { - @include radius($key,$direction,false) - } - } - } -} +@mixin radius($r,$d:null ,$important: false){ + $radius-value:map-get($uni-radius, $r) if($important, !important, null); + // Key exists within the $uni-radius variable + @if (map-has-key($uni-radius, $r) and $d){ + @if $d == t { + border-top-left-radius:$radius-value; + border-top-right-radius:$radius-value; + }@else if $d == r { + border-top-right-radius:$radius-value; + border-bottom-right-radius:$radius-value; + }@else if $d == b { + border-bottom-left-radius:$radius-value; + border-bottom-right-radius:$radius-value; + }@else if $d == l { + border-top-left-radius:$radius-value; + border-bottom-left-radius:$radius-value; + }@else if $d == tl { + border-top-left-radius:$radius-value; + }@else if $d == tr { + border-top-right-radius:$radius-value; + }@else if $d == br { + border-bottom-right-radius:$radius-value; + }@else if $d == bl { + border-bottom-left-radius:$radius-value; + } + }@else{ + border-radius:$radius-value; + } +} + +@each $key, $child in $uni-radius { + @if($key){ + .uni-radius-#{"" + $key} { + @include radius($key) + } + }@else{ + .uni-radius { + @include radius($key) + } + } +} + +@each $direction in t, r, b, l,tl, tr, br, bl { + @each $key, $child in $uni-radius { + @if($key){ + .uni-radius-#{"" + $direction}-#{"" + $key} { + @include radius($key,$direction,false) + } + }@else{ + .uni-radius-#{$direction} { + @include radius($key,$direction,false) + } + } + } +} diff --git a/uni_modules/uni-scss/styles/setting/_space.scss b/uni_modules/uni-scss/styles/setting/_space.scss index 3c895289..9c3b17bd 100644 --- a/uni_modules/uni-scss/styles/setting/_space.scss +++ b/uni_modules/uni-scss/styles/setting/_space.scss @@ -1,56 +1,56 @@ - -@mixin fn($space,$direction,$size,$n) { - @if $n { - #{$space}-#{$direction}: #{$size*$uni-space-root}px - } @else { - #{$space}-#{$direction}: #{-$size*$uni-space-root}px - } -} -@mixin get-styles($direction,$i,$space,$n){ - @if $direction == t { - @include fn($space, top,$i,$n); - } - @if $direction == r { - @include fn($space, right,$i,$n); - } - @if $direction == b { - @include fn($space, bottom,$i,$n); - } - @if $direction == l { - @include fn($space, left,$i,$n); - } - @if $direction == x { - @include fn($space, left,$i,$n); - @include fn($space, right,$i,$n); - } - @if $direction == y { - @include fn($space, top,$i,$n); - @include fn($space, bottom,$i,$n); - } - @if $direction == a { - @if $n { - #{$space}:#{$i*$uni-space-root}px; - } @else { - #{$space}:#{-$i*$uni-space-root}px; - } - } -} - -@each $orientation in m,p { - $space: margin; - @if $orientation == m { - $space: margin; - } @else { - $space: padding; - } - @for $i from 0 through 16 { - @each $direction in t, r, b, l, x, y, a { - .uni-#{$orientation}#{$direction}-#{$i} { - @include get-styles($direction,$i,$space,true); - } - .uni-#{$orientation}#{$direction}-n#{$i} { - @include get-styles($direction,$i,$space,false); - } - } - } + +@mixin fn($space,$direction,$size,$n) { + @if $n { + #{$space}-#{$direction}: #{$size*$uni-space-root}px + } @else { + #{$space}-#{$direction}: #{-$size*$uni-space-root}px + } +} +@mixin get-styles($direction,$i,$space,$n){ + @if $direction == t { + @include fn($space, top,$i,$n); + } + @if $direction == r { + @include fn($space, right,$i,$n); + } + @if $direction == b { + @include fn($space, bottom,$i,$n); + } + @if $direction == l { + @include fn($space, left,$i,$n); + } + @if $direction == x { + @include fn($space, left,$i,$n); + @include fn($space, right,$i,$n); + } + @if $direction == y { + @include fn($space, top,$i,$n); + @include fn($space, bottom,$i,$n); + } + @if $direction == a { + @if $n { + #{$space}:#{$i*$uni-space-root}px; + } @else { + #{$space}:#{-$i*$uni-space-root}px; + } + } +} + +@each $orientation in m,p { + $space: margin; + @if $orientation == m { + $space: margin; + } @else { + $space: padding; + } + @for $i from 0 through 16 { + @each $direction in t, r, b, l, x, y, a { + .uni-#{$orientation}#{$direction}-#{$i} { + @include get-styles($direction,$i,$space,true); + } + .uni-#{$orientation}#{$direction}-n#{$i} { + @include get-styles($direction,$i,$space,false); + } + } + } } \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/setting/_styles.scss b/uni_modules/uni-scss/styles/setting/_styles.scss index 689afec6..6f882c85 100644 --- a/uni_modules/uni-scss/styles/setting/_styles.scss +++ b/uni_modules/uni-scss/styles/setting/_styles.scss @@ -1,167 +1,167 @@ -/* #ifndef APP-NVUE */ - -$-color-white:#fff; -$-color-black:#000; -@mixin base-style($color) { - color: #fff; - background-color: $color; - border-color: mix($-color-black, $color, 8%); - &:not([hover-class]):active { - background: mix($-color-black, $color, 10%); - border-color: mix($-color-black, $color, 20%); - color: $-color-white; - outline: none; - } -} -@mixin is-color($color) { - @include base-style($color); - &[loading] { - @include base-style($color); - &::before { - margin-right:5px; - } - } - &[disabled] { - &, - &[loading], - &:not([hover-class]):active { - color: $-color-white; - border-color: mix(darken($color,10%), $-color-white); - background-color: mix($color, $-color-white); - } - } - -} -@mixin base-plain-style($color) { - color:$color; - background-color: mix($-color-white, $color, 90%); - border-color: mix($-color-white, $color, 70%); - &:not([hover-class]):active { - background: mix($-color-white, $color, 80%); - color: $color; - outline: none; - border-color: mix($-color-white, $color, 50%); - } -} -@mixin is-plain($color){ - &[plain] { - @include base-plain-style($color); - &[loading] { - @include base-plain-style($color); - &::before { - margin-right:5px; - } - } - &[disabled] { - &, - &:active { - color: mix($-color-white, $color, 40%); - background-color: mix($-color-white, $color, 90%); - border-color: mix($-color-white, $color, 80%); - } - } - } -} - - -.uni-btn { - margin: 5px; - color: #393939; - border:1px solid #ccc; - font-size: 16px; - font-weight: 200; - background-color: #F9F9F9; - // TODO 暂时处理边框隐藏一边的问题 - overflow: visible; - &::after{ - border: none; - } - - &:not([type]),&[type=default] { - color: #999; - &[loading] { - background: none; - &::before { - margin-right:5px; - } - } - - - - &[disabled]{ - color: mix($-color-white, #999, 60%); - &, - &[loading], - &:active { - color: mix($-color-white, #999, 60%); - background-color: mix($-color-white,$-color-black , 98%); - border-color: mix($-color-white, #999, 85%); - } - } - - &[plain] { - color: #999; - background: none; - border-color: $uni-border-1; - &:not([hover-class]):active { - background: none; - color: mix($-color-white, $-color-black, 80%); - border-color: mix($-color-white, $-color-black, 90%); - outline: none; - } - &[disabled]{ - &, - &[loading], - &:active { - background: none; - color: mix($-color-white, #999, 60%); - border-color: mix($-color-white, #999, 85%); - } - } - } - } - - &:not([hover-class]):active { - color: mix($-color-white, $-color-black, 50%); - } - - &[size=mini] { - font-size: 16px; - font-weight: 200; - border-radius: 8px; - } - - - - &.uni-btn-small { - font-size: 14px; - } - &.uni-btn-mini { - font-size: 12px; - } - - &.uni-btn-radius { - border-radius: 999px; - } - &[type=primary] { - @include is-color($uni-primary); - @include is-plain($uni-primary) - } - &[type=success] { - @include is-color($uni-success); - @include is-plain($uni-success) - } - &[type=error] { - @include is-color($uni-error); - @include is-plain($uni-error) - } - &[type=warning] { - @include is-color($uni-warning); - @include is-plain($uni-warning) - } - &[type=info] { - @include is-color($uni-info); - @include is-plain($uni-info) - } -} -/* #endif */ +/* #ifndef APP-NVUE */ + +$-color-white:#fff; +$-color-black:#000; +@mixin base-style($color) { + color: #fff; + background-color: $color; + border-color: mix($-color-black, $color, 8%); + &:not([hover-class]):active { + background: mix($-color-black, $color, 10%); + border-color: mix($-color-black, $color, 20%); + color: $-color-white; + outline: none; + } +} +@mixin is-color($color) { + @include base-style($color); + &[loading] { + @include base-style($color); + &::before { + margin-right:5px; + } + } + &[disabled] { + &, + &[loading], + &:not([hover-class]):active { + color: $-color-white; + border-color: mix(darken($color,10%), $-color-white); + background-color: mix($color, $-color-white); + } + } + +} +@mixin base-plain-style($color) { + color:$color; + background-color: mix($-color-white, $color, 90%); + border-color: mix($-color-white, $color, 70%); + &:not([hover-class]):active { + background: mix($-color-white, $color, 80%); + color: $color; + outline: none; + border-color: mix($-color-white, $color, 50%); + } +} +@mixin is-plain($color){ + &[plain] { + @include base-plain-style($color); + &[loading] { + @include base-plain-style($color); + &::before { + margin-right:5px; + } + } + &[disabled] { + &, + &:active { + color: mix($-color-white, $color, 40%); + background-color: mix($-color-white, $color, 90%); + border-color: mix($-color-white, $color, 80%); + } + } + } +} + + +.uni-btn { + margin: 5px; + color: #393939; + border:1px solid #ccc; + font-size: 16px; + font-weight: 200; + background-color: #F9F9F9; + // TODO 暂时处理边框隐藏一边的问题 + overflow: visible; + &::after{ + border: none; + } + + &:not([type]),&[type=default] { + color: #999; + &[loading] { + background: none; + &::before { + margin-right:5px; + } + } + + + + &[disabled]{ + color: mix($-color-white, #999, 60%); + &, + &[loading], + &:active { + color: mix($-color-white, #999, 60%); + background-color: mix($-color-white,$-color-black , 98%); + border-color: mix($-color-white, #999, 85%); + } + } + + &[plain] { + color: #999; + background: none; + border-color: $uni-border-1; + &:not([hover-class]):active { + background: none; + color: mix($-color-white, $-color-black, 80%); + border-color: mix($-color-white, $-color-black, 90%); + outline: none; + } + &[disabled]{ + &, + &[loading], + &:active { + background: none; + color: mix($-color-white, #999, 60%); + border-color: mix($-color-white, #999, 85%); + } + } + } + } + + &:not([hover-class]):active { + color: mix($-color-white, $-color-black, 50%); + } + + &[size=mini] { + font-size: 16px; + font-weight: 200; + border-radius: 8px; + } + + + + &.uni-btn-small { + font-size: 14px; + } + &.uni-btn-mini { + font-size: 12px; + } + + &.uni-btn-radius { + border-radius: 999px; + } + &[type=primary] { + @include is-color($uni-primary); + @include is-plain($uni-primary) + } + &[type=success] { + @include is-color($uni-success); + @include is-plain($uni-success) + } + &[type=error] { + @include is-color($uni-error); + @include is-plain($uni-error) + } + &[type=warning] { + @include is-color($uni-warning); + @include is-plain($uni-warning) + } + &[type=info] { + @include is-color($uni-info); + @include is-plain($uni-info) + } +} +/* #endif */ diff --git a/uni_modules/uni-scss/styles/setting/_text.scss b/uni_modules/uni-scss/styles/setting/_text.scss index a34d08f3..0a89590b 100644 --- a/uni_modules/uni-scss/styles/setting/_text.scss +++ b/uni_modules/uni-scss/styles/setting/_text.scss @@ -1,24 +1,24 @@ -@mixin get-styles($k,$c) { - @if $k == size or $k == weight{ - font-#{$k}:#{$c} - }@else{ - #{$k}:#{$c} - } -} - -@each $key, $child in $uni-headings { - /* #ifndef APP-NVUE */ - .uni-#{$key} { - @each $k, $c in $child { - @include get-styles($k,$c) - } - } - /* #endif */ - /* #ifdef APP-NVUE */ - .container .uni-#{$key} { - @each $k, $c in $child { - @include get-styles($k,$c) - } - } - /* #endif */ -} +@mixin get-styles($k,$c) { + @if $k == size or $k == weight{ + font-#{$k}:#{$c} + }@else{ + #{$k}:#{$c} + } +} + +@each $key, $child in $uni-headings { + /* #ifndef APP-NVUE */ + .uni-#{$key} { + @each $k, $c in $child { + @include get-styles($k,$c) + } + } + /* #endif */ + /* #ifdef APP-NVUE */ + .container .uni-#{$key} { + @each $k, $c in $child { + @include get-styles($k,$c) + } + } + /* #endif */ +} diff --git a/uni_modules/uni-scss/styles/setting/_variables.scss b/uni_modules/uni-scss/styles/setting/_variables.scss index 557d3d7c..5fb5d9b9 100644 --- a/uni_modules/uni-scss/styles/setting/_variables.scss +++ b/uni_modules/uni-scss/styles/setting/_variables.scss @@ -1,146 +1,146 @@ -// @use "sass:math"; -@import '../tools/functions.scss'; -// 间距基础倍数 -$uni-space-root: 2 !default; -// 边框半径默认值 -$uni-radius-root:5px !default; -$uni-radius: () !default; -// 边框半径断点 -$uni-radius: map-deep-merge( - ( - 0: 0, - // TODO 当前版本暂时不支持 sm 属性 - // 'sm': math.div($uni-radius-root, 2), - null: $uni-radius-root, - 'lg': $uni-radius-root * 2, - 'xl': $uni-radius-root * 6, - 'pill': 9999px, - 'circle': 50% - ), - $uni-radius -); -// 字体家族 -$body-font-family: 'Roboto', sans-serif !default; -// 文本 -$heading-font-family: $body-font-family !default; -$uni-headings: () !default; -$letterSpacing: -0.01562em; -$uni-headings: map-deep-merge( - ( - 'h1': ( - size: 32px, - weight: 300, - line-height: 50px, - // letter-spacing:-0.01562em - ), - 'h2': ( - size: 28px, - weight: 300, - line-height: 40px, - // letter-spacing: -0.00833em - ), - 'h3': ( - size: 24px, - weight: 400, - line-height: 32px, - // letter-spacing: normal - ), - 'h4': ( - size: 20px, - weight: 400, - line-height: 30px, - // letter-spacing: 0.00735em - ), - 'h5': ( - size: 16px, - weight: 400, - line-height: 24px, - // letter-spacing: normal - ), - 'h6': ( - size: 14px, - weight: 500, - line-height: 18px, - // letter-spacing: 0.0125em - ), - 'subtitle': ( - size: 12px, - weight: 400, - line-height: 20px, - // letter-spacing: 0.00937em - ), - 'body': ( - font-size: 14px, - font-weight: 400, - line-height: 22px, - // letter-spacing: 0.03125em - ), - 'caption': ( - 'size': 12px, - 'weight': 400, - 'line-height': 20px, - // 'letter-spacing': 0.03333em, - // 'text-transform': false - ) - ), - $uni-headings -); - - - -// 主色 -$uni-primary: #2979ff !default; -$uni-primary-disable:lighten($uni-primary,20%) !default; -$uni-primary-light: lighten($uni-primary,25%) !default; - -// 辅助色 -// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 -$uni-success: #18bc37 !default; -$uni-success-disable:lighten($uni-success,20%) !default; -$uni-success-light: lighten($uni-success,25%) !default; - -$uni-warning: #f3a73f !default; -$uni-warning-disable:lighten($uni-warning,20%) !default; -$uni-warning-light: lighten($uni-warning,25%) !default; - -$uni-error: #e43d33 !default; -$uni-error-disable:lighten($uni-error,20%) !default; -$uni-error-light: lighten($uni-error,25%) !default; - -$uni-info: #8f939c !default; -$uni-info-disable:lighten($uni-info,20%) !default; -$uni-info-light: lighten($uni-info,25%) !default; - -// 中性色 -// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 -$uni-main-color: #3a3a3a !default; // 主要文字 -$uni-base-color: #6a6a6a !default; // 常规文字 -$uni-secondary-color: #909399 !default; // 次要文字 -$uni-extra-color: #c7c7c7 !default; // 辅助说明 - -// 边框颜色 -$uni-border-1: #F0F0F0 !default; -$uni-border-2: #EDEDED !default; -$uni-border-3: #DCDCDC !default; -$uni-border-4: #B9B9B9 !default; - -// 常规色 -$uni-black: #000000 !default; -$uni-white: #ffffff !default; -$uni-transparent: rgba($color: #000000, $alpha: 0) !default; - -// 背景色 -$uni-bg-color: #f7f7f7 !default; - -/* 水平间距 */ -$uni-spacing-sm: 8px !default; -$uni-spacing-base: 15px !default; -$uni-spacing-lg: 30px !default; - -// 阴影 -$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5) !default; -$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default; -$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5) !default; - -// 蒙版 -$uni-mask: rgba($color: #000000, $alpha: 0.4) !default; +// @use "sass:math"; +@import '../tools/functions.scss'; +// 间距基础倍数 +$uni-space-root: 2 !default; +// 边框半径默认值 +$uni-radius-root:5px !default; +$uni-radius: () !default; +// 边框半径断点 +$uni-radius: map-deep-merge( + ( + 0: 0, + // TODO 当前版本暂时不支持 sm 属性 + // 'sm': math.div($uni-radius-root, 2), + null: $uni-radius-root, + 'lg': $uni-radius-root * 2, + 'xl': $uni-radius-root * 6, + 'pill': 9999px, + 'circle': 50% + ), + $uni-radius +); +// 字体家族 +$body-font-family: 'Roboto', sans-serif !default; +// 文本 +$heading-font-family: $body-font-family !default; +$uni-headings: () !default; +$letterSpacing: -0.01562em; +$uni-headings: map-deep-merge( + ( + 'h1': ( + size: 32px, + weight: 300, + line-height: 50px, + // letter-spacing:-0.01562em + ), + 'h2': ( + size: 28px, + weight: 300, + line-height: 40px, + // letter-spacing: -0.00833em + ), + 'h3': ( + size: 24px, + weight: 400, + line-height: 32px, + // letter-spacing: normal + ), + 'h4': ( + size: 20px, + weight: 400, + line-height: 30px, + // letter-spacing: 0.00735em + ), + 'h5': ( + size: 16px, + weight: 400, + line-height: 24px, + // letter-spacing: normal + ), + 'h6': ( + size: 14px, + weight: 500, + line-height: 18px, + // letter-spacing: 0.0125em + ), + 'subtitle': ( + size: 12px, + weight: 400, + line-height: 20px, + // letter-spacing: 0.00937em + ), + 'body': ( + font-size: 14px, + font-weight: 400, + line-height: 22px, + // letter-spacing: 0.03125em + ), + 'caption': ( + 'size': 12px, + 'weight': 400, + 'line-height': 20px, + // 'letter-spacing': 0.03333em, + // 'text-transform': false + ) + ), + $uni-headings +); + + + +// 主色 +$uni-primary: #2979ff !default; +$uni-primary-disable:lighten($uni-primary,20%) !default; +$uni-primary-light: lighten($uni-primary,25%) !default; + +// 辅助色 +// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 +$uni-success: #18bc37 !default; +$uni-success-disable:lighten($uni-success,20%) !default; +$uni-success-light: lighten($uni-success,25%) !default; + +$uni-warning: #f3a73f !default; +$uni-warning-disable:lighten($uni-warning,20%) !default; +$uni-warning-light: lighten($uni-warning,25%) !default; + +$uni-error: #e43d33 !default; +$uni-error-disable:lighten($uni-error,20%) !default; +$uni-error-light: lighten($uni-error,25%) !default; + +$uni-info: #8f939c !default; +$uni-info-disable:lighten($uni-info,20%) !default; +$uni-info-light: lighten($uni-info,25%) !default; + +// 中性色 +// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 +$uni-main-color: #3a3a3a !default; // 主要文字 +$uni-base-color: #6a6a6a !default; // 常规文字 +$uni-secondary-color: #909399 !default; // 次要文字 +$uni-extra-color: #c7c7c7 !default; // 辅助说明 + +// 边框颜色 +$uni-border-1: #F0F0F0 !default; +$uni-border-2: #EDEDED !default; +$uni-border-3: #DCDCDC !default; +$uni-border-4: #B9B9B9 !default; + +// 常规色 +$uni-black: #000000 !default; +$uni-white: #ffffff !default; +$uni-transparent: rgba($color: #000000, $alpha: 0) !default; + +// 背景色 +$uni-bg-color: #f7f7f7 !default; + +/* 水平间距 */ +$uni-spacing-sm: 8px !default; +$uni-spacing-base: 15px !default; +$uni-spacing-lg: 30px !default; + +// 阴影 +$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5) !default; +$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default; +$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5) !default; + +// 蒙版 +$uni-mask: rgba($color: #000000, $alpha: 0.4) !default; diff --git a/uni_modules/uni-scss/styles/tools/functions.scss b/uni_modules/uni-scss/styles/tools/functions.scss index ac6f63e5..a71beeb2 100644 --- a/uni_modules/uni-scss/styles/tools/functions.scss +++ b/uni_modules/uni-scss/styles/tools/functions.scss @@ -1,19 +1,19 @@ -// 合并 map -@function map-deep-merge($parent-map, $child-map){ - $result: $parent-map; - @each $key, $child in $child-map { - $parent-has-key: map-has-key($result, $key); - $parent-value: map-get($result, $key); - $parent-type: type-of($parent-value); - $child-type: type-of($child); - $parent-is-map: $parent-type == map; - $child-is-map: $child-type == map; - - @if (not $parent-has-key) or ($parent-type != $child-type) or (not ($parent-is-map and $child-is-map)){ - $result: map-merge($result, ( $key: $child )); - }@else { - $result: map-merge($result, ( $key: map-deep-merge($parent-value, $child) )); - } - } - @return $result; -}; +// 合并 map +@function map-deep-merge($parent-map, $child-map){ + $result: $parent-map; + @each $key, $child in $child-map { + $parent-has-key: map-has-key($result, $key); + $parent-value: map-get($result, $key); + $parent-type: type-of($parent-value); + $child-type: type-of($child); + $parent-is-map: $parent-type == map; + $child-is-map: $child-type == map; + + @if (not $parent-has-key) or ($parent-type != $child-type) or (not ($parent-is-map and $child-is-map)){ + $result: map-merge($result, ( $key: $child )); + }@else { + $result: map-merge($result, ( $key: map-deep-merge($parent-value, $child) )); + } + } + @return $result; +}; diff --git a/uni_modules/uni-scss/theme.scss b/uni_modules/uni-scss/theme.scss index 80ee62f7..20cdf5eb 100644 --- a/uni_modules/uni-scss/theme.scss +++ b/uni_modules/uni-scss/theme.scss @@ -1,31 +1,31 @@ -// 间距基础倍数 -$uni-space-root: 2; -// 边框半径默认值 -$uni-radius-root:5px; -// 主色 -$uni-primary: #2979ff; -// 辅助色 -$uni-success: #4cd964; -// 警告色 -$uni-warning: #f0ad4e; -// 错误色 -$uni-error: #dd524d; -// 描述色 -$uni-info: #909399; -// 中性色 -$uni-main-color: #303133; -$uni-base-color: #606266; -$uni-secondary-color: #909399; -$uni-extra-color: #C0C4CC; -// 背景色 -$uni-bg-color: #f5f5f5; -// 边框颜色 -$uni-border-1: #DCDFE6; -$uni-border-2: #E4E7ED; -$uni-border-3: #EBEEF5; -$uni-border-4: #F2F6FC; - -// 常规色 -$uni-black: #000000; -$uni-white: #ffffff; -$uni-transparent: rgba($color: #000000, $alpha: 0); +// 间距基础倍数 +$uni-space-root: 2; +// 边框半径默认值 +$uni-radius-root:5px; +// 主色 +$uni-primary: #2979ff; +// 辅助色 +$uni-success: #4cd964; +// 警告色 +$uni-warning: #f0ad4e; +// 错误色 +$uni-error: #dd524d; +// 描述色 +$uni-info: #909399; +// 中性色 +$uni-main-color: #303133; +$uni-base-color: #606266; +$uni-secondary-color: #909399; +$uni-extra-color: #C0C4CC; +// 背景色 +$uni-bg-color: #f5f5f5; +// 边框颜色 +$uni-border-1: #DCDFE6; +$uni-border-2: #E4E7ED; +$uni-border-3: #EBEEF5; +$uni-border-4: #F2F6FC; + +// 常规色 +$uni-black: #000000; +$uni-white: #ffffff; +$uni-transparent: rgba($color: #000000, $alpha: 0); diff --git a/uni_modules/uni-scss/variables.scss b/uni_modules/uni-scss/variables.scss index 1c062d42..49a89b6f 100644 --- a/uni_modules/uni-scss/variables.scss +++ b/uni_modules/uni-scss/variables.scss @@ -1,62 +1,62 @@ -@import './styles/setting/_variables.scss'; -// 间距基础倍数 -$uni-space-root: 2; -// 边框半径默认值 -$uni-radius-root:5px; - -// 主色 -$uni-primary: #2979ff; -$uni-primary-disable:mix(#fff,$uni-primary,50%); -$uni-primary-light: mix(#fff,$uni-primary,80%); - -// 辅助色 -// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 -$uni-success: #18bc37; -$uni-success-disable:mix(#fff,$uni-success,50%); -$uni-success-light: mix(#fff,$uni-success,80%); - -$uni-warning: #f3a73f; -$uni-warning-disable:mix(#fff,$uni-warning,50%); -$uni-warning-light: mix(#fff,$uni-warning,80%); - -$uni-error: #e43d33; -$uni-error-disable:mix(#fff,$uni-error,50%); -$uni-error-light: mix(#fff,$uni-error,80%); - -$uni-info: #8f939c; -$uni-info-disable:mix(#fff,$uni-info,50%); -$uni-info-light: mix(#fff,$uni-info,80%); - -// 中性色 -// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 -$uni-main-color: #3a3a3a; // 主要文字 -$uni-base-color: #6a6a6a; // 常规文字 -$uni-secondary-color: #909399; // 次要文字 -$uni-extra-color: #c7c7c7; // 辅助说明 - -// 边框颜色 -$uni-border-1: #F0F0F0; -$uni-border-2: #EDEDED; -$uni-border-3: #DCDCDC; -$uni-border-4: #B9B9B9; - -// 常规色 -$uni-black: #000000; -$uni-white: #ffffff; -$uni-transparent: rgba($color: #000000, $alpha: 0); - -// 背景色 -$uni-bg-color: #f7f7f7; - -/* 水平间距 */ -$uni-spacing-sm: 8px; -$uni-spacing-base: 15px; -$uni-spacing-lg: 30px; - -// 阴影 -$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5); -$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2); -$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5); - -// 蒙版 -$uni-mask: rgba($color: #000000, $alpha: 0.4); +@import './styles/setting/_variables.scss'; +// 间距基础倍数 +$uni-space-root: 2; +// 边框半径默认值 +$uni-radius-root:5px; + +// 主色 +$uni-primary: #2979ff; +$uni-primary-disable:mix(#fff,$uni-primary,50%); +$uni-primary-light: mix(#fff,$uni-primary,80%); + +// 辅助色 +// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 +$uni-success: #18bc37; +$uni-success-disable:mix(#fff,$uni-success,50%); +$uni-success-light: mix(#fff,$uni-success,80%); + +$uni-warning: #f3a73f; +$uni-warning-disable:mix(#fff,$uni-warning,50%); +$uni-warning-light: mix(#fff,$uni-warning,80%); + +$uni-error: #e43d33; +$uni-error-disable:mix(#fff,$uni-error,50%); +$uni-error-light: mix(#fff,$uni-error,80%); + +$uni-info: #8f939c; +$uni-info-disable:mix(#fff,$uni-info,50%); +$uni-info-light: mix(#fff,$uni-info,80%); + +// 中性色 +// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 +$uni-main-color: #3a3a3a; // 主要文字 +$uni-base-color: #6a6a6a; // 常规文字 +$uni-secondary-color: #909399; // 次要文字 +$uni-extra-color: #c7c7c7; // 辅助说明 + +// 边框颜色 +$uni-border-1: #F0F0F0; +$uni-border-2: #EDEDED; +$uni-border-3: #DCDCDC; +$uni-border-4: #B9B9B9; + +// 常规色 +$uni-black: #000000; +$uni-white: #ffffff; +$uni-transparent: rgba($color: #000000, $alpha: 0); + +// 背景色 +$uni-bg-color: #f7f7f7; + +/* 水平间距 */ +$uni-spacing-sm: 8px; +$uni-spacing-base: 15px; +$uni-spacing-lg: 30px; + +// 阴影 +$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5); +$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2); +$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5); + +// 蒙版 +$uni-mask: rgba($color: #000000, $alpha: 0.4); diff --git a/uni_modules/uni-search-bar/changelog.md b/uni_modules/uni-search-bar/changelog.md index b41fdd3b..dc17cd8c 100644 --- a/uni_modules/uni-search-bar/changelog.md +++ b/uni_modules/uni-search-bar/changelog.md @@ -1,33 +1,33 @@ -## 1.2.3(2022-05-24) -- 新增 readonly 属性,组件只读 -## 1.2.2(2022-05-06) -- 修复 vue3 input 事件不生效的bug -## 1.2.1(2022-05-06) -- 修复 多余代码导致的bug -## 1.2.0(2021-11-19) -- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) -- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-search-bar](https://uniapp.dcloud.io/component/uniui/uni-search-bar) -## 1.1.2(2021-08-30) -- 修复 value 属性与 modelValue 属性不兼容的Bug -## 1.1.1(2021-08-24) -- 新增 支持国际化 -## 1.1.0(2021-07-30) -- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -## 1.0.9(2021-05-12) -- 新增 项目示例地址 -## 1.0.8(2021-04-21) -- 优化 添加依赖 uni-icons, 导入后自动下载依赖 -## 1.0.7(2021-04-15) -- uni-ui 新增 uni-search-bar 的 focus 事件 - -## 1.0.6(2021-02-05) -- 优化 组件引用关系,通过uni_modules引用组件 - -## 1.0.5(2021-02-05) -- 调整为uni_modules目录规范 -- 新增 支持双向绑定 -- 更改 input 事件的返回值,e={value:Number} --> e=value -- 新增 支持图标插槽 -- 新增 支持 clear、blur 事件 -- 新增 支持 focus 属性 -- 去掉组件背景色 +## 1.2.3(2022-05-24) +- 新增 readonly 属性,组件只读 +## 1.2.2(2022-05-06) +- 修复 vue3 input 事件不生效的bug +## 1.2.1(2022-05-06) +- 修复 多余代码导致的bug +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-search-bar](https://uniapp.dcloud.io/component/uniui/uni-search-bar) +## 1.1.2(2021-08-30) +- 修复 value 属性与 modelValue 属性不兼容的Bug +## 1.1.1(2021-08-24) +- 新增 支持国际化 +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.9(2021-05-12) +- 新增 项目示例地址 +## 1.0.8(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 1.0.7(2021-04-15) +- uni-ui 新增 uni-search-bar 的 focus 事件 + +## 1.0.6(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.5(2021-02-05) +- 调整为uni_modules目录规范 +- 新增 支持双向绑定 +- 更改 input 事件的返回值,e={value:Number} --> e=value +- 新增 支持图标插槽 +- 新增 支持 clear、blur 事件 +- 新增 支持 focus 属性 +- 去掉组件背景色 diff --git a/uni_modules/uni-search-bar/components/uni-search-bar/i18n/en.json b/uni_modules/uni-search-bar/components/uni-search-bar/i18n/en.json index dd083a53..114877eb 100644 --- a/uni_modules/uni-search-bar/components/uni-search-bar/i18n/en.json +++ b/uni_modules/uni-search-bar/components/uni-search-bar/i18n/en.json @@ -1,4 +1,4 @@ -{ - "uni-search-bar.cancel": "cancel", - "uni-search-bar.placeholder": "Search enter content" +{ + "uni-search-bar.cancel": "cancel", + "uni-search-bar.placeholder": "Search enter content" } \ No newline at end of file diff --git a/uni_modules/uni-search-bar/components/uni-search-bar/i18n/index.js b/uni_modules/uni-search-bar/components/uni-search-bar/i18n/index.js index de7509c8..d2afd081 100644 --- a/uni_modules/uni-search-bar/components/uni-search-bar/i18n/index.js +++ b/uni_modules/uni-search-bar/components/uni-search-bar/i18n/index.js @@ -1,8 +1,8 @@ -import en from './en.json' -import zhHans from './zh-Hans.json' -import zhHant from './zh-Hant.json' -export default { - en, - 'zh-Hans': zhHans, - 'zh-Hant': zhHant -} +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hans.json b/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hans.json index d4e5c120..77368bc3 100644 --- a/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hans.json +++ b/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hans.json @@ -1,4 +1,4 @@ -{ - "uni-search-bar.cancel": "cancel", - "uni-search-bar.placeholder": "请输入搜索内容" -} +{ + "uni-search-bar.cancel": "cancel", + "uni-search-bar.placeholder": "请输入搜索内容" +} diff --git a/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hant.json b/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hant.json index 318b6ef1..8732ce9d 100644 --- a/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hant.json +++ b/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hant.json @@ -1,4 +1,4 @@ -{ - "uni-search-bar.cancel": "cancel", - "uni-search-bar.placeholder": "請輸入搜索內容" -} +{ + "uni-search-bar.cancel": "cancel", + "uni-search-bar.placeholder": "請輸入搜索內容" +} diff --git a/uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue b/uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue index 2befbcc7..06f3da5f 100644 --- a/uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue +++ b/uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue @@ -1,298 +1,298 @@ - - - - - + + + + + diff --git a/uni_modules/uni-search-bar/package.json b/uni_modules/uni-search-bar/package.json index 9352c574..2678061d 100644 --- a/uni_modules/uni-search-bar/package.json +++ b/uni_modules/uni-search-bar/package.json @@ -1,89 +1,89 @@ -{ - "id": "uni-search-bar", - "displayName": "uni-search-bar 搜索栏", - "version": "1.2.3", - "description": "搜索栏组件,通常用于搜索商品、文章等", - "keywords": [ - "uni-ui", - "uniui", - "搜索框", - "搜索栏" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "" - }, - "directories": { - "example": "../../temps/example_temps" - }, - "dcloudext": { - "category": [ - "前端组件", - "通用组件" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" - }, - "uni_modules": { - "dependencies": [ - "uni-scss", - "uni-icons" - ], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "App": { - "app-vue": "y", - "app-nvue": "y" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" - }, - "快应用": { - "华为": "u", - "联盟": "u" - }, - "Vue": { - "vue2": "y", - "vue3": "y" - } - } - } - } +{ + "id": "uni-search-bar", + "displayName": "uni-search-bar 搜索栏", + "version": "1.2.3", + "description": "搜索栏组件,通常用于搜索商品、文章等", + "keywords": [ + "uni-ui", + "uniui", + "搜索框", + "搜索栏" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } } \ No newline at end of file diff --git a/uni_modules/uni-search-bar/readme.md b/uni_modules/uni-search-bar/readme.md index 253092f0..b9f2373b 100644 --- a/uni_modules/uni-search-bar/readme.md +++ b/uni_modules/uni-search-bar/readme.md @@ -1,14 +1,14 @@ - - -## SearchBar 搜索栏 - -> **组件名:uni-search-bar** -> 代码块: `uSearchBar` - - -搜索栏组件 - -### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-search-bar) -#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 - - + + +## SearchBar 搜索栏 + +> **组件名:uni-search-bar** +> 代码块: `uSearchBar` + + +搜索栏组件 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-search-bar) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-segmented-control/changelog.md b/uni_modules/uni-segmented-control/changelog.md index a44385d7..8f3aa3ee 100644 --- a/uni_modules/uni-segmented-control/changelog.md +++ b/uni_modules/uni-segmented-control/changelog.md @@ -1,9 +1,9 @@ -## 1.2.0(2021-11-19) -- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) -- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-segmented-control](https://uniapp.dcloud.io/component/uniui/uni-segmented-control) -## 1.1.0(2021-07-30) -- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -## 1.0.5(2021-05-12) -- 新增 项目示例地址 -## 1.0.4(2021-02-05) -- 调整为uni_modules目录规范 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-segmented-control](https://uniapp.dcloud.io/component/uniui/uni-segmented-control) +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.5(2021-05-12) +- 新增 项目示例地址 +## 1.0.4(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue b/uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue index 044a4951..f9f383ee 100644 --- a/uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue +++ b/uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue @@ -1,145 +1,145 @@ - - - - - + + + + + diff --git a/uni_modules/uni-segmented-control/package.json b/uni_modules/uni-segmented-control/package.json index 6cae41db..a40732da 100644 --- a/uni_modules/uni-segmented-control/package.json +++ b/uni_modules/uni-segmented-control/package.json @@ -1,87 +1,87 @@ -{ - "id": "uni-segmented-control", - "displayName": "uni-segmented-control 分段器", - "version": "1.2.0", - "description": "分段器由至少 2 个分段控件组成,用作不同视图的显示", - "keywords": [ - "uni-ui", - "uniui", - "分段器", - "segement", - "顶部选择" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "" - }, - "directories": { - "example": "../../temps/example_temps" - }, - "dcloudext": { - "category": [ - "前端组件", - "通用组件" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" - }, - "uni_modules": { - "dependencies": ["uni-scss"], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "App": { - "app-vue": "y", - "app-nvue": "y" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" - }, - "快应用": { - "华为": "u", - "联盟": "u" - }, - "Vue": { - "vue2": "y", - "vue3": "y" - } - } - } - } +{ + "id": "uni-segmented-control", + "displayName": "uni-segmented-control 分段器", + "version": "1.2.0", + "description": "分段器由至少 2 个分段控件组成,用作不同视图的显示", + "keywords": [ + "uni-ui", + "uniui", + "分段器", + "segement", + "顶部选择" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } } \ No newline at end of file diff --git a/uni_modules/uni-segmented-control/readme.md b/uni_modules/uni-segmented-control/readme.md index 3527b03f..3278ea6d 100644 --- a/uni_modules/uni-segmented-control/readme.md +++ b/uni_modules/uni-segmented-control/readme.md @@ -1,13 +1,13 @@ - - -## SegmentedControl 分段器 -> **组件名:uni-segmented-control** -> 代码块: `uSegmentedControl` - - -用作不同视图的显示 - -### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-segmented-control) -#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 - - + + +## SegmentedControl 分段器 +> **组件名:uni-segmented-control** +> 代码块: `uSegmentedControl` + + +用作不同视图的显示 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-segmented-control) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-steps/changelog.md b/uni_modules/uni-steps/changelog.md index cb9d3679..3d804cb1 100644 --- a/uni_modules/uni-steps/changelog.md +++ b/uni_modules/uni-steps/changelog.md @@ -1,16 +1,16 @@ -## 1.1.1(2021-11-22) -- 修复 vue3中某些scss变量无法找到的问题 -## 1.1.0(2021-11-19) -- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) -- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-steps](https://uniapp.dcloud.io/component/uniui/uni-steps) -## 1.0.8(2021-05-12) -- 新增 项目示例地址 -## 1.0.7(2021-05-06) -- 修复 uni-steps 横向布局时,多行文字高度不合理的 bug -## 1.0.6(2021-04-21) -- 优化 添加依赖 uni-icons, 导入后自动下载依赖 -## 1.0.5(2021-02-05) -- 优化 组件引用关系,通过uni_modules引用组件 - -## 1.0.4(2021-02-05) -- 调整为uni_modules目录规范 +## 1.1.1(2021-11-22) +- 修复 vue3中某些scss变量无法找到的问题 +## 1.1.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-steps](https://uniapp.dcloud.io/component/uniui/uni-steps) +## 1.0.8(2021-05-12) +- 新增 项目示例地址 +## 1.0.7(2021-05-06) +- 修复 uni-steps 横向布局时,多行文字高度不合理的 bug +## 1.0.6(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 1.0.5(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.4(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-steps/components/uni-steps/uni-steps.vue b/uni_modules/uni-steps/components/uni-steps/uni-steps.vue index a6c8f287..9a01dbb9 100644 --- a/uni_modules/uni-steps/components/uni-steps/uni-steps.vue +++ b/uni_modules/uni-steps/components/uni-steps/uni-steps.vue @@ -1,269 +1,269 @@ - - - - - + + + + + diff --git a/uni_modules/uni-steps/package.json b/uni_modules/uni-steps/package.json index c687b40a..dbebafba 100644 --- a/uni_modules/uni-steps/package.json +++ b/uni_modules/uni-steps/package.json @@ -1,89 +1,89 @@ -{ - "id": "uni-steps", - "displayName": "uni-steps 步骤条", - "version": "1.1.1", - "description": "步骤条组件,提供横向和纵向两种布局格式。", - "keywords": [ - "uni-ui", - "uniui", - "步骤条", - "时间轴" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "" - }, - "directories": { - "example": "../../temps/example_temps" - }, - "dcloudext": { - "category": [ - "前端组件", - "通用组件" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" - }, - "uni_modules": { - "dependencies": [ - "uni-scss", - "uni-icons" - ], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "App": { - "app-vue": "y", - "app-nvue": "y" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" - }, - "快应用": { - "华为": "u", - "联盟": "u" - }, - "Vue": { - "vue2": "y", - "vue3": "y" - } - } - } - } +{ + "id": "uni-steps", + "displayName": "uni-steps 步骤条", + "version": "1.1.1", + "description": "步骤条组件,提供横向和纵向两种布局格式。", + "keywords": [ + "uni-ui", + "uniui", + "步骤条", + "时间轴" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } } \ No newline at end of file diff --git a/uni_modules/uni-steps/readme.md b/uni_modules/uni-steps/readme.md index da7a4bfa..09fea788 100644 --- a/uni_modules/uni-steps/readme.md +++ b/uni_modules/uni-steps/readme.md @@ -1,13 +1,13 @@ - - -## Steps 步骤条 -> **组件名:uni-steps** -> 代码块: `uSteps` - - -步骤条,常用于显示进度 - -### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-steps) -#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 - - + + +## Steps 步骤条 +> **组件名:uni-steps** +> 代码块: `uSteps` + + +步骤条,常用于显示进度 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-steps) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-swiper-dot/changelog.md b/uni_modules/uni-swiper-dot/changelog.md index 85cf54d2..c606ffe0 100644 --- a/uni_modules/uni-swiper-dot/changelog.md +++ b/uni_modules/uni-swiper-dot/changelog.md @@ -1,12 +1,12 @@ -## 1.2.0(2021-11-19) -- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) -- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-swiper-dot](https://uniapp.dcloud.io/component/uniui/uni-swiper-dot) -## 1.1.0(2021-07-30) -- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -## 1.0.6(2021-05-12) -- 新增 示例地址 -- 修复 示例项目缺少组件的Bug -## 1.0.5(2021-02-05) -- 调整为uni_modules目录规范 -- 新增 clickItem 事件,支持指示点控制轮播 -- 新增 支持 pc 可用 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-swiper-dot](https://uniapp.dcloud.io/component/uniui/uni-swiper-dot) +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.6(2021-05-12) +- 新增 示例地址 +- 修复 示例项目缺少组件的Bug +## 1.0.5(2021-02-05) +- 调整为uni_modules目录规范 +- 新增 clickItem 事件,支持指示点控制轮播 +- 新增 支持 pc 可用 diff --git a/uni_modules/uni-swiper-dot/components/uni-swiper-dot/uni-swiper-dot.vue b/uni_modules/uni-swiper-dot/components/uni-swiper-dot/uni-swiper-dot.vue index e66b6c7a..52d11054 100644 --- a/uni_modules/uni-swiper-dot/components/uni-swiper-dot/uni-swiper-dot.vue +++ b/uni_modules/uni-swiper-dot/components/uni-swiper-dot/uni-swiper-dot.vue @@ -1,218 +1,218 @@ - - - - - + + + + + diff --git a/uni_modules/uni-swiper-dot/package.json b/uni_modules/uni-swiper-dot/package.json index f2dd8d2a..b9b126a5 100644 --- a/uni_modules/uni-swiper-dot/package.json +++ b/uni_modules/uni-swiper-dot/package.json @@ -1,87 +1,87 @@ -{ - "id": "uni-swiper-dot", - "displayName": "uni-swiper-dot 轮播图指示点", - "version": "1.2.0", - "description": "自定义轮播图指示点组件", - "keywords": [ - "uni-ui", - "uniui", - "轮播图指示点", - "dot", - "swiper" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "" - }, - "directories": { - "example": "../../temps/example_temps" - }, - "dcloudext": { - "category": [ - "前端组件", - "通用组件" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" - }, - "uni_modules": { - "dependencies": ["uni-scss"], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "App": { - "app-vue": "y", - "app-nvue": "y" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" - }, - "快应用": { - "华为": "u", - "联盟": "u" - }, - "Vue": { - "vue2": "y", - "vue3": "y" - } - } - } - } +{ + "id": "uni-swiper-dot", + "displayName": "uni-swiper-dot 轮播图指示点", + "version": "1.2.0", + "description": "自定义轮播图指示点组件", + "keywords": [ + "uni-ui", + "uniui", + "轮播图指示点", + "dot", + "swiper" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } } \ No newline at end of file diff --git a/uni_modules/uni-swiper-dot/readme.md b/uni_modules/uni-swiper-dot/readme.md index 7d397e2c..badf99b2 100644 --- a/uni_modules/uni-swiper-dot/readme.md +++ b/uni_modules/uni-swiper-dot/readme.md @@ -1,11 +1,11 @@ - - -## SwiperDot 轮播图指示点 -> **组件名:uni-swiper-dot** -> 代码块: `uSwiperDot` - - -自定义轮播图指示点 - -### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-swiper-dot) + + +## SwiperDot 轮播图指示点 +> **组件名:uni-swiper-dot** +> 代码块: `uSwiperDot` + + +自定义轮播图指示点 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-swiper-dot) #### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-tag/changelog.md b/uni_modules/uni-tag/changelog.md index c0c5839b..1c097ea6 100644 --- a/uni_modules/uni-tag/changelog.md +++ b/uni_modules/uni-tag/changelog.md @@ -1,21 +1,21 @@ -## 2.1.0(2021-11-19) -- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) -- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-tag](https://uniapp.dcloud.io/component/uniui/uni-tag) -## 2.0.0(2021-11-09) -- 新增 提供组件设计资源,组件样式调整 -- 移除 插槽 -- 移除 type 属性的 royal 选项 -## 1.1.1(2021-08-11) -- type 不是 default 时,size 为 small 字体大小显示不正确 -## 1.1.0(2021-07-30) -- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -## 1.0.7(2021-06-18) -- 修复 uni-tag 在字节跳动小程序上 css 类名编译错误的 bug -## 1.0.6(2021-06-04) -- 修复 未定义 sass 变量 "$uni-color-royal" 的bug -## 1.0.5(2021-05-10) -- 修复 royal 类型无效的bug -- 修复 uni-tag 宽度不自适应的bug -- 新增 uni-tag 支持属性 custom-style 自定义样式 -## 1.0.4(2021-02-05) -- 调整为uni_modules目录规范 +## 2.1.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-tag](https://uniapp.dcloud.io/component/uniui/uni-tag) +## 2.0.0(2021-11-09) +- 新增 提供组件设计资源,组件样式调整 +- 移除 插槽 +- 移除 type 属性的 royal 选项 +## 1.1.1(2021-08-11) +- type 不是 default 时,size 为 small 字体大小显示不正确 +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.7(2021-06-18) +- 修复 uni-tag 在字节跳动小程序上 css 类名编译错误的 bug +## 1.0.6(2021-06-04) +- 修复 未定义 sass 变量 "$uni-color-royal" 的bug +## 1.0.5(2021-05-10) +- 修复 royal 类型无效的bug +- 修复 uni-tag 宽度不自适应的bug +- 新增 uni-tag 支持属性 custom-style 自定义样式 +## 1.0.4(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-tag/components/uni-tag/uni-tag.vue b/uni_modules/uni-tag/components/uni-tag/uni-tag.vue index 418c9550..d3a89fdd 100644 --- a/uni_modules/uni-tag/components/uni-tag/uni-tag.vue +++ b/uni_modules/uni-tag/components/uni-tag/uni-tag.vue @@ -1,252 +1,252 @@ - - - - - + + + + + diff --git a/uni_modules/uni-tag/package.json b/uni_modules/uni-tag/package.json index 18780886..48594e02 100644 --- a/uni_modules/uni-tag/package.json +++ b/uni_modules/uni-tag/package.json @@ -1,87 +1,87 @@ -{ - "id": "uni-tag", - "displayName": "uni-tag 标签", - "version": "2.1.0", - "description": "Tag 组件,用于展示1个或多个文字标签,可点击切换选中、不选中的状态。", - "keywords": [ - "uni-ui", - "uniui", - "", - "tag", - "标签" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "" - }, - "directories": { - "example": "../../temps/example_temps" - }, - "dcloudext": { - "category": [ - "前端组件", - "通用组件" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" - }, - "uni_modules": { - "dependencies": ["uni-scss"], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "App": { - "app-vue": "y", - "app-nvue": "y" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" - }, - "快应用": { - "华为": "u", - "联盟": "u" - }, - "Vue": { - "vue2": "y", - "vue3": "y" - } - } - } - } +{ + "id": "uni-tag", + "displayName": "uni-tag 标签", + "version": "2.1.0", + "description": "Tag 组件,用于展示1个或多个文字标签,可点击切换选中、不选中的状态。", + "keywords": [ + "uni-ui", + "uniui", + "", + "tag", + "标签" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } } \ No newline at end of file diff --git a/uni_modules/uni-tag/readme.md b/uni_modules/uni-tag/readme.md index 6e78ff5e..f14494c5 100644 --- a/uni_modules/uni-tag/readme.md +++ b/uni_modules/uni-tag/readme.md @@ -1,13 +1,13 @@ - - -## Tag 标签 -> **组件名:uni-tag** -> 代码块: `uTag` - - -用于展示1个或多个文字标签,可点击切换选中、不选中的状态 。 - -### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-tag) -#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 - - + + +## Tag 标签 +> **组件名:uni-tag** +> 代码块: `uTag` + + +用于展示1个或多个文字标签,可点击切换选中、不选中的状态 。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-tag) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-title/changelog.md b/uni_modules/uni-title/changelog.md index 76262165..2121c5b3 100644 --- a/uni_modules/uni-title/changelog.md +++ b/uni_modules/uni-title/changelog.md @@ -1,10 +1,10 @@ -## 1.1.1(2022-05-19) -- 修改组件描述 -## 1.1.0(2021-11-19) -- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) -- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-title](https://uniapp.dcloud.io/component/uniui/uni-title) -## 1.0.2(2021-05-12) -- 新增 示例地址 -- 修复 示例项目缺少组件的Bug -## 1.0.1(2021-02-05) -- 调整为uni_modules目录规范 +## 1.1.1(2022-05-19) +- 修改组件描述 +## 1.1.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-title](https://uniapp.dcloud.io/component/uniui/uni-title) +## 1.0.2(2021-05-12) +- 新增 示例地址 +- 修复 示例项目缺少组件的Bug +## 1.0.1(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-title/components/uni-title/uni-title.vue b/uni_modules/uni-title/components/uni-title/uni-title.vue index bf4f9265..37761b11 100644 --- a/uni_modules/uni-title/components/uni-title/uni-title.vue +++ b/uni_modules/uni-title/components/uni-title/uni-title.vue @@ -1,171 +1,171 @@ - - - - - + + + + + diff --git a/uni_modules/uni-title/package.json b/uni_modules/uni-title/package.json index 2249f5a1..76255ab8 100644 --- a/uni_modules/uni-title/package.json +++ b/uni_modules/uni-title/package.json @@ -1,88 +1,88 @@ -{ - "id": "uni-title", - "displayName": "uni-title 章节标题", - "version": "1.1.1", - "description": "章节标题,通常用于记录页面标题,使用当前组件,uni-app 如果开启统计,将会自动统计页面标题", - "keywords": [ - "uni-ui", - "uniui", - "标题", - "章节", - "章节标题", - "" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "" - }, - "directories": { - "example": "../../temps/example_temps" - }, - "dcloudext": { - "category": [ - "前端组件", - "通用组件" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" - }, - "uni_modules": { - "dependencies": ["uni-scss"], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "App": { - "app-vue": "y", - "app-nvue": "y" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" - }, - "快应用": { - "华为": "u", - "联盟": "u" - }, - "Vue": { - "vue2": "y", - "vue3": "y" - } - } - } - } +{ + "id": "uni-title", + "displayName": "uni-title 章节标题", + "version": "1.1.1", + "description": "章节标题,通常用于记录页面标题,使用当前组件,uni-app 如果开启统计,将会自动统计页面标题", + "keywords": [ + "uni-ui", + "uniui", + "标题", + "章节", + "章节标题", + "" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } } \ No newline at end of file diff --git a/uni_modules/uni-title/readme.md b/uni_modules/uni-title/readme.md index 0e60b1b9..7d43b7ea 100644 --- a/uni_modules/uni-title/readme.md +++ b/uni_modules/uni-title/readme.md @@ -1,14 +1,14 @@ - - -## Title 标题 -> **组件名:uni-title** -> 代码块: `uTitle` - - -章节标题,通常用于记录页面标题,使用当前组件,uni-app 如果开启统计,将会自动统计页面标题 。 - -### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-title) -#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 - - - + + +## Title 标题 +> **组件名:uni-title** +> 代码块: `uTitle` + + +章节标题,通常用于记录页面标题,使用当前组件,uni-app 如果开启统计,将会自动统计页面标题 。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-title) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + + diff --git a/uni_modules/uni-tooltip/changelog.md b/uni_modules/uni-tooltip/changelog.md index 00f1572d..bba77ae0 100644 --- a/uni_modules/uni-tooltip/changelog.md +++ b/uni_modules/uni-tooltip/changelog.md @@ -1,10 +1,10 @@ -## 0.2.1(2022-05-09) -- 修复 content 为空时仍然弹出的bug -## 0.2.0(2022-05-07) -**注意:破坏性更新** -- 更新 text 属性变更为 content -- 更新 移除 width 属性 -## 0.1.1(2022-04-27) -- 修复 组件根 text 嵌套组件 warning -## 0.1.0(2022-04-21) -- 初始化 +## 0.2.1(2022-05-09) +- 修复 content 为空时仍然弹出的bug +## 0.2.0(2022-05-07) +**注意:破坏性更新** +- 更新 text 属性变更为 content +- 更新 移除 width 属性 +## 0.1.1(2022-04-27) +- 修复 组件根 text 嵌套组件 warning +## 0.1.0(2022-04-21) +- 初始化 diff --git a/uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue b/uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue index ffbb6fa5..0f400f73 100644 --- a/uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue +++ b/uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue @@ -1,68 +1,68 @@ - - - - - - + + + + + + diff --git a/uni_modules/uni-tooltip/package.json b/uni_modules/uni-tooltip/package.json index b626efb8..dc5f336f 100644 --- a/uni_modules/uni-tooltip/package.json +++ b/uni_modules/uni-tooltip/package.json @@ -1,83 +1,83 @@ -{ - "id": "uni-tooltip", - "displayName": "uni-tooltip", - "version": "0.2.1", - "description": "Tooltip 提示文字", - "keywords": [ - "uni-tooltip", - "uni-ui", - "tooltip", - "tip", - "文字提示" -], - "repository": "", -"engines": { - }, - "dcloudext": { - "category": [ - "前端组件", - "通用组件" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无 ", - "data": "无", - "permissions": "无" - }, - "npmurl": "" - }, - "uni_modules": { - "dependencies": [], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "Vue": { - "vue2": "y", - "vue3": "y" - }, - "App": { - "app-vue": "y", - "app-nvue": "u" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "u", - "百度": "u", - "字节跳动": "u", - "QQ": "u" - }, - "快应用": { - "华为": "u", - "联盟": "u" - } - } - } - } +{ + "id": "uni-tooltip", + "displayName": "uni-tooltip", + "version": "0.2.1", + "description": "Tooltip 提示文字", + "keywords": [ + "uni-tooltip", + "uni-ui", + "tooltip", + "tip", + "文字提示" +], + "repository": "", +"engines": { + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无 ", + "data": "无", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "u" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "u", + "百度": "u", + "字节跳动": "u", + "QQ": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } } \ No newline at end of file diff --git a/uni_modules/uni-tooltip/readme.md b/uni_modules/uni-tooltip/readme.md index faafa2ec..db86f063 100644 --- a/uni_modules/uni-tooltip/readme.md +++ b/uni_modules/uni-tooltip/readme.md @@ -1,8 +1,8 @@ -## Badge 数字角标 -> **组件名:uni-tooltip** -> 代码块: `uTooltip` - -数字角标一般和其它控件(列表、9宫格等)配合使用,用于进行数量提示,默认为实心灰色背景, - -### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-tooltip) -#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 +## Badge 数字角标 +> **组件名:uni-tooltip** +> 代码块: `uTooltip` + +数字角标一般和其它控件(列表、9宫格等)配合使用,用于进行数量提示,默认为实心灰色背景, + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-tooltip) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 diff --git a/uni_modules/uni-transition/changelog.md b/uni_modules/uni-transition/changelog.md index b1a824b8..a7a8c0a3 100644 --- a/uni_modules/uni-transition/changelog.md +++ b/uni_modules/uni-transition/changelog.md @@ -1,20 +1,20 @@ -## 1.3.1(2021-11-23) -- 修复 init 方法初始化问题 -## 1.3.0(2021-11-19) -- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) -- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-transition](https://uniapp.dcloud.io/component/uniui/uni-transition) -## 1.2.1(2021-09-27) -- 修复 init 方法不生效的 Bug -## 1.2.0(2021-07-30) -- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -## 1.1.1(2021-05-12) -- 新增 示例地址 -- 修复 示例项目缺少组件的 Bug -## 1.1.0(2021-04-22) -- 新增 通过方法自定义动画 -- 新增 custom-class 非 NVUE 平台支持自定义 class 定制样式 -- 优化 动画触发逻辑,使动画更流畅 -- 优化 支持单独的动画类型 -- 优化 文档示例 -## 1.0.2(2021-02-05) -- 调整为 uni_modules 目录规范 +## 1.3.1(2021-11-23) +- 修复 init 方法初始化问题 +## 1.3.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-transition](https://uniapp.dcloud.io/component/uniui/uni-transition) +## 1.2.1(2021-09-27) +- 修复 init 方法不生效的 Bug +## 1.2.0(2021-07-30) +- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.1(2021-05-12) +- 新增 示例地址 +- 修复 示例项目缺少组件的 Bug +## 1.1.0(2021-04-22) +- 新增 通过方法自定义动画 +- 新增 custom-class 非 NVUE 平台支持自定义 class 定制样式 +- 优化 动画触发逻辑,使动画更流畅 +- 优化 支持单独的动画类型 +- 优化 文档示例 +## 1.0.2(2021-02-05) +- 调整为 uni_modules 目录规范 diff --git a/uni_modules/uni-transition/components/uni-transition/createAnimation.js b/uni_modules/uni-transition/components/uni-transition/createAnimation.js index 5f54365e..55a76633 100644 --- a/uni_modules/uni-transition/components/uni-transition/createAnimation.js +++ b/uni_modules/uni-transition/components/uni-transition/createAnimation.js @@ -1,128 +1,128 @@ -// const defaultOption = { -// duration: 300, -// timingFunction: 'linear', -// delay: 0, -// transformOrigin: '50% 50% 0' -// } -// #ifdef APP-NVUE -const nvueAnimation = uni.requireNativePlugin('animation') -// #endif -class MPAnimation { - constructor(options, _this) { - this.options = options - this.animation = uni.createAnimation(options) - this.currentStepAnimates = {} - this.next = 0 - this.$ = _this - - } - - _nvuePushAnimates(type, args) { - let aniObj = this.currentStepAnimates[this.next] - let styles = {} - if (!aniObj) { - styles = { - styles: {}, - config: {} - } - } else { - styles = aniObj - } - if (animateTypes1.includes(type)) { - if (!styles.styles.transform) { - styles.styles.transform = '' - } - let unit = '' - if(type === 'rotate'){ - unit = 'deg' - } - styles.styles.transform += `${type}(${args+unit}) ` - } else { - styles.styles[type] = `${args}` - } - this.currentStepAnimates[this.next] = styles - } - _animateRun(styles = {}, config = {}) { - let ref = this.$.$refs['ani'].ref - if (!ref) return - return new Promise((resolve, reject) => { - nvueAnimation.transition(ref, { - styles, - ...config - }, res => { - resolve() - }) - }) - } - - _nvueNextAnimate(animates, step = 0, fn) { - let obj = animates[step] - if (obj) { - let { - styles, - config - } = obj - this._animateRun(styles, config).then(() => { - step += 1 - this._nvueNextAnimate(animates, step, fn) - }) - } else { - this.currentStepAnimates = {} - typeof fn === 'function' && fn() - this.isEnd = true - } - } - - step(config = {}) { - // #ifndef APP-NVUE - this.animation.step(config) - // #endif - // #ifdef APP-NVUE - this.currentStepAnimates[this.next].config = Object.assign({}, this.options, config) - this.currentStepAnimates[this.next].styles.transformOrigin = this.currentStepAnimates[this.next].config.transformOrigin - this.next++ - // #endif - return this - } - - run(fn) { - // #ifndef APP-NVUE - this.$.animationData = this.animation.export() - this.$.timer = setTimeout(() => { - typeof fn === 'function' && fn() - }, this.$.durationTime) - // #endif - // #ifdef APP-NVUE - this.isEnd = false - let ref = this.$.$refs['ani'] && this.$.$refs['ani'].ref - if(!ref) return - this._nvueNextAnimate(this.currentStepAnimates, 0, fn) - this.next = 0 - // #endif - } -} - - -const animateTypes1 = ['matrix', 'matrix3d', 'rotate', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scale3d', - 'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'translate', 'translate3d', 'translateX', 'translateY', - 'translateZ' -] -const animateTypes2 = ['opacity', 'backgroundColor'] -const animateTypes3 = ['width', 'height', 'left', 'right', 'top', 'bottom'] -animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => { - MPAnimation.prototype[type] = function(...args) { - // #ifndef APP-NVUE - this.animation[type](...args) - // #endif - // #ifdef APP-NVUE - this._nvuePushAnimates(type, args) - // #endif - return this - } -}) - -export function createAnimation(option, _this) { - if(!_this) return - clearTimeout(_this.timer) - return new MPAnimation(option, _this) -} +// const defaultOption = { +// duration: 300, +// timingFunction: 'linear', +// delay: 0, +// transformOrigin: '50% 50% 0' +// } +// #ifdef APP-NVUE +const nvueAnimation = uni.requireNativePlugin('animation') +// #endif +class MPAnimation { + constructor(options, _this) { + this.options = options + this.animation = uni.createAnimation(options) + this.currentStepAnimates = {} + this.next = 0 + this.$ = _this + + } + + _nvuePushAnimates(type, args) { + let aniObj = this.currentStepAnimates[this.next] + let styles = {} + if (!aniObj) { + styles = { + styles: {}, + config: {} + } + } else { + styles = aniObj + } + if (animateTypes1.includes(type)) { + if (!styles.styles.transform) { + styles.styles.transform = '' + } + let unit = '' + if(type === 'rotate'){ + unit = 'deg' + } + styles.styles.transform += `${type}(${args+unit}) ` + } else { + styles.styles[type] = `${args}` + } + this.currentStepAnimates[this.next] = styles + } + _animateRun(styles = {}, config = {}) { + let ref = this.$.$refs['ani'].ref + if (!ref) return + return new Promise((resolve, reject) => { + nvueAnimation.transition(ref, { + styles, + ...config + }, res => { + resolve() + }) + }) + } + + _nvueNextAnimate(animates, step = 0, fn) { + let obj = animates[step] + if (obj) { + let { + styles, + config + } = obj + this._animateRun(styles, config).then(() => { + step += 1 + this._nvueNextAnimate(animates, step, fn) + }) + } else { + this.currentStepAnimates = {} + typeof fn === 'function' && fn() + this.isEnd = true + } + } + + step(config = {}) { + // #ifndef APP-NVUE + this.animation.step(config) + // #endif + // #ifdef APP-NVUE + this.currentStepAnimates[this.next].config = Object.assign({}, this.options, config) + this.currentStepAnimates[this.next].styles.transformOrigin = this.currentStepAnimates[this.next].config.transformOrigin + this.next++ + // #endif + return this + } + + run(fn) { + // #ifndef APP-NVUE + this.$.animationData = this.animation.export() + this.$.timer = setTimeout(() => { + typeof fn === 'function' && fn() + }, this.$.durationTime) + // #endif + // #ifdef APP-NVUE + this.isEnd = false + let ref = this.$.$refs['ani'] && this.$.$refs['ani'].ref + if(!ref) return + this._nvueNextAnimate(this.currentStepAnimates, 0, fn) + this.next = 0 + // #endif + } +} + + +const animateTypes1 = ['matrix', 'matrix3d', 'rotate', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scale3d', + 'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'translate', 'translate3d', 'translateX', 'translateY', + 'translateZ' +] +const animateTypes2 = ['opacity', 'backgroundColor'] +const animateTypes3 = ['width', 'height', 'left', 'right', 'top', 'bottom'] +animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => { + MPAnimation.prototype[type] = function(...args) { + // #ifndef APP-NVUE + this.animation[type](...args) + // #endif + // #ifdef APP-NVUE + this._nvuePushAnimates(type, args) + // #endif + return this + } +}) + +export function createAnimation(option, _this) { + if(!_this) return + clearTimeout(_this.timer) + return new MPAnimation(option, _this) +} diff --git a/uni_modules/uni-transition/components/uni-transition/uni-transition.vue b/uni_modules/uni-transition/components/uni-transition/uni-transition.vue index 2d570302..00963712 100644 --- a/uni_modules/uni-transition/components/uni-transition/uni-transition.vue +++ b/uni_modules/uni-transition/components/uni-transition/uni-transition.vue @@ -1,299 +1,299 @@ - - - - - + + + + + diff --git a/uni_modules/uni-transition/package.json b/uni_modules/uni-transition/package.json index d15fdf01..379e9aae 100644 --- a/uni_modules/uni-transition/package.json +++ b/uni_modules/uni-transition/package.json @@ -1,87 +1,87 @@ -{ - "id": "uni-transition", - "displayName": "uni-transition 过渡动画", - "version": "1.3.1", - "description": "元素的简单过渡动画", - "keywords": [ - "uni-ui", - "uniui", - "动画", - "过渡", - "过渡动画" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "" - }, - "directories": { - "example": "../../temps/example_temps" - }, - "dcloudext": { - "category": [ - "前端组件", - "通用组件" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" - }, - "uni_modules": { - "dependencies": ["uni-scss"], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "App": { - "app-vue": "y", - "app-nvue": "y" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" - }, - "快应用": { - "华为": "u", - "联盟": "u" - }, - "Vue": { - "vue2": "y", - "vue3": "y" - } - } - } - } +{ + "id": "uni-transition", + "displayName": "uni-transition 过渡动画", + "version": "1.3.1", + "description": "元素的简单过渡动画", + "keywords": [ + "uni-ui", + "uniui", + "动画", + "过渡", + "过渡动画" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } } \ No newline at end of file diff --git a/uni_modules/uni-transition/readme.md b/uni_modules/uni-transition/readme.md index 2f8a77e1..1e104fe5 100644 --- a/uni_modules/uni-transition/readme.md +++ b/uni_modules/uni-transition/readme.md @@ -1,11 +1,11 @@ - - -## Transition 过渡动画 -> **组件名:uni-transition** -> 代码块: `uTransition` - - -元素过渡动画 - -### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-transition) + + +## Transition 过渡动画 +> **组件名:uni-transition** +> 代码块: `uTransition` + + +元素过渡动画 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-transition) #### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/z-paging/changelog.md b/uni_modules/z-paging/changelog.md index d1e10438..1622b694 100644 --- a/uni_modules/z-paging/changelog.md +++ b/uni_modules/z-paging/changelog.md @@ -1,74 +1,74 @@ -## 2.7.11(2024-06-28) -1.`新增` 方法`updateVirtualListRender`,支持手动触发虚拟列表渲染更新。 -2.`新增` 延迟加载列表演示。 -3.`修复` v2.7.8引出的vue3+npm+微信小程序中,`uni.$zp`配置失效的问题。 -4.`修复` 在本地分页+虚拟列表情况下,虚拟列表cell未被正常销毁的问题。 -5.`修复` 打开调试模式下无法获取getApp导致的`cannot read property 'zp_handleQueryCallback' of undefined`的报错。 -6.`修复` 极小概率出现的分页请求较快且快速滚动到底部时未能加载更多的问题。 -## 2.7.10(2024-05-10) -1.`修复` v2.7.8引出的vue3+npm+微信小程序中,uni.$zp配置失效的问题。 -## 2.7.9(2024-05-10) -1.`修复` 在新版HbuilderX+vue3+微信小程序中可能出现的加载第二页数据后返回顶部无法下拉的问题。 -2.`修复` 在vue3+抖音小程序中可能出现的首次加载reload没有触发的问题。 -3.`优化` ts类型中,`ZPagingInstance`泛型不必填,默认为`any`。 -## 2.7.8(2024-05-09) -1.`新增` typescript类型声明文件,感谢小何同学提供。 -2.`新增` 添加极简写法fetch相关配置及示例。 -3.`新增` `fixed-cellHeight`配置,支持在虚拟列表中自定义固定的cell高度。 -4.`新增` `refresher-refreshing-scrollable`配置,支持自定义下拉刷新中是否允许列表滚动。 -5.`修复` 在新版HubilderX+vue3+h5中,`swiper-demo`模式`slot=top`被导航栏遮挡的问题。 -6.`修复` 下拉进入二楼偶现的二楼高度未铺满全屏的问题。 -7.`修复` 虚拟列表中complete若传相同对象会导致key重复的问题。 -8.`修复` 在虚拟列表中调用refresh后缓存高度原始数据未清空的问题。 -9.`修复` 聊天记录模式删除记录时顶部显示loading的问题。 -9.`优化` `scrollIntoViewByIndex`支持在虚拟列表中滚动到指定cell。 -10.`优化` `content-z-index`默认值修改为1。 -## 2.7.7(2024-04-01) -1.`新增` 下拉进入二楼功能及相关配置&demo。 -2.`新增` 虚拟列表写法添加【非内置列表】写法,可良好兼容vue3中的各平台并有较优的性能表现。 -3.`新增` `z-paging-cell`补充`@touchstart`事件。 -4.`修复` 页面滚动模式设置了`auto-full-height`后可能出现的依然有异常空白占位的问题和下拉刷新时列表数据被切割的问题。 -## 2.7.6(2024-02-29) -1.`新增` `max-width`,支持设置`z-paging`的最大宽度,默认`z-paging`宽度铺满窗口。 -2.`新增` `chat-adjust-position-offset`,支持设置使用聊天记录模式中键盘弹出时占位高度偏移距离。 -3.`修复` 由于renderjs中聊天记录模式判断不准确导致的可能出现的从聊天记录页面跳转到其他页面后返回页面无法滚动的问题。 -4.`修复` 聊天记录模式首次加载失败后,发送消息顶部会显示加载失败文字的问题。 -5.`修复` 聊天记录模式nvue可能出现的键盘弹出无法滚动到底部的问题。 -6.`修复` 聊天记录模式+nvue滚动条无法展示的问题&底部会显示加载中的问题。 -7.`修复` 聊天记录模式监听键盘弹出可能出现的无法正常销毁的问题。 -8.`修复` 直接修改dataList的值组件内部的值未更新的问题。 -## 2.7.5(2024-01-23) -1.`新增` props:`chat-loading-more-default-as-loading`,支持设置在聊天记录模式中滑动到顶部状态为默认状态时,以加载中的状态展示。 -2.`新增` slots:`chatNoMore`,支持自定义聊天记录模式没有更多数据view。 -3.`修复` 固定在底部view可能出现默认黄色的问题。 -4.`优化` 聊天记录加载更多样式,与普通模式对齐,支持点击加载更多&点击重试,并支持加载更多相关配置。 -5.`优化` 微调下拉刷新和底部加载更多样式。 -6.`优化` 聊天记录模式自动滚动到底部添加延时以避免可能出现的滚动到底部位置不正确的问题。 -7.`优化` 使用新的判断滚动到顶部算法以解决在安卓设备中可能出现的因滚动到顶部时scrollTop不为0导致的下拉刷新被禁用的问题。 -## 2.7.4(2024-01-14) -1.`新增` props:`auto-adjust-position-when-chat`,支持设置使用聊天记录模式中键盘弹出时是否自动调整slot="bottom"高度。 -2.`新增` props:`auto-to-bottom-when-chat`,支持设置使用聊天记录模式中键盘弹出时是否自动滚动到底部。 -3.`新增` props:`show-chat-loading-when-reload`,支持设置使用聊天记录模式中reload时是否显示chatLoading。 -4.`修复` 在聊天记录模式中`scrollIntoViewById`和`scrollIntoViewByNodeTop`无效的问题。 -5.`优化` 聊天记录模式底部安全区域针对键盘开启/关闭兼容处理。 -6.`优化` 更新内置的空数据图&加载失败图,感谢图鸟UI提供的免费可商用的空数据图和加载失败图! -## 2.7.3(2024-01-10) -1.`新增` 聊天记录模式支持虚拟列表&添加相关demo。 -2.`新增` nvue中list添加`@scrollend`监听。 -3.`优化` 聊天记录模式+vue第一页并且没有更多时不倒置列表。 -4.`优化` 聊天记录模式+nvue中数据不满屏时默认从顶部开始,不进行列表倒置。 -## 2.7.2(2024-01-09) -1.`修复` `vue3+h5`中报错`uni.onKeyboardHeightChange is not a function`的问题。 -2.`优化` 聊天记录模式细节:表情面板在触摸列表时隐藏&添加隐藏动画。 -## 2.7.1(2024-01-08) -1.`新增` `keyboardHeightChange` event,支持监听键盘高度改变。 -2.`新增` 聊天记录模式新增切换表情面板/键盘demo。 -3.`优化` 键盘弹出占位添加动画效果。 -## 2.7.0(2024-01-07) -2024新年快乐!!祝大家在新的一年里工作顺利,事事顺心! -1.`新增` 全新的聊天记录模式设计!将vue中的聊天记录模式与nvue中对齐,完全解决了聊天记录模式滚动到顶部加载更多在vue中抖动的问题,同时将聊天记录模式键盘自动弹出自动上推页面交由`z-paging`处理,解决了由此引发的各种问题,尤其是在微信小程序中导航栏被键盘顶出屏幕外的问题。如果您使用了`z-paging`的聊天记录模式,强烈建议更新,写法有一定变更,具体请参见demo。 -2.`新增` `swiper-demo`新增`onShow`时候调用reload演示。 -3.`修复` 修复滚动相关方法在微信小程序中首次滚动动画无效的问题。 -4.`修复` props设置单位,单位为px时报错的问题。 -5.`修复` 在某些情况下`z-paging`加载了但是未渲染时,reload无效的问题。 -6.`修复` 底部loading动画未生效的问题。 +## 2.7.11(2024-06-28) +1.`新增` 方法`updateVirtualListRender`,支持手动触发虚拟列表渲染更新。 +2.`新增` 延迟加载列表演示。 +3.`修复` v2.7.8引出的vue3+npm+微信小程序中,`uni.$zp`配置失效的问题。 +4.`修复` 在本地分页+虚拟列表情况下,虚拟列表cell未被正常销毁的问题。 +5.`修复` 打开调试模式下无法获取getApp导致的`cannot read property 'zp_handleQueryCallback' of undefined`的报错。 +6.`修复` 极小概率出现的分页请求较快且快速滚动到底部时未能加载更多的问题。 +## 2.7.10(2024-05-10) +1.`修复` v2.7.8引出的vue3+npm+微信小程序中,uni.$zp配置失效的问题。 +## 2.7.9(2024-05-10) +1.`修复` 在新版HbuilderX+vue3+微信小程序中可能出现的加载第二页数据后返回顶部无法下拉的问题。 +2.`修复` 在vue3+抖音小程序中可能出现的首次加载reload没有触发的问题。 +3.`优化` ts类型中,`ZPagingInstance`泛型不必填,默认为`any`。 +## 2.7.8(2024-05-09) +1.`新增` typescript类型声明文件,感谢小何同学提供。 +2.`新增` 添加极简写法fetch相关配置及示例。 +3.`新增` `fixed-cellHeight`配置,支持在虚拟列表中自定义固定的cell高度。 +4.`新增` `refresher-refreshing-scrollable`配置,支持自定义下拉刷新中是否允许列表滚动。 +5.`修复` 在新版HubilderX+vue3+h5中,`swiper-demo`模式`slot=top`被导航栏遮挡的问题。 +6.`修复` 下拉进入二楼偶现的二楼高度未铺满全屏的问题。 +7.`修复` 虚拟列表中complete若传相同对象会导致key重复的问题。 +8.`修复` 在虚拟列表中调用refresh后缓存高度原始数据未清空的问题。 +9.`修复` 聊天记录模式删除记录时顶部显示loading的问题。 +9.`优化` `scrollIntoViewByIndex`支持在虚拟列表中滚动到指定cell。 +10.`优化` `content-z-index`默认值修改为1。 +## 2.7.7(2024-04-01) +1.`新增` 下拉进入二楼功能及相关配置&demo。 +2.`新增` 虚拟列表写法添加【非内置列表】写法,可良好兼容vue3中的各平台并有较优的性能表现。 +3.`新增` `z-paging-cell`补充`@touchstart`事件。 +4.`修复` 页面滚动模式设置了`auto-full-height`后可能出现的依然有异常空白占位的问题和下拉刷新时列表数据被切割的问题。 +## 2.7.6(2024-02-29) +1.`新增` `max-width`,支持设置`z-paging`的最大宽度,默认`z-paging`宽度铺满窗口。 +2.`新增` `chat-adjust-position-offset`,支持设置使用聊天记录模式中键盘弹出时占位高度偏移距离。 +3.`修复` 由于renderjs中聊天记录模式判断不准确导致的可能出现的从聊天记录页面跳转到其他页面后返回页面无法滚动的问题。 +4.`修复` 聊天记录模式首次加载失败后,发送消息顶部会显示加载失败文字的问题。 +5.`修复` 聊天记录模式nvue可能出现的键盘弹出无法滚动到底部的问题。 +6.`修复` 聊天记录模式+nvue滚动条无法展示的问题&底部会显示加载中的问题。 +7.`修复` 聊天记录模式监听键盘弹出可能出现的无法正常销毁的问题。 +8.`修复` 直接修改dataList的值组件内部的值未更新的问题。 +## 2.7.5(2024-01-23) +1.`新增` props:`chat-loading-more-default-as-loading`,支持设置在聊天记录模式中滑动到顶部状态为默认状态时,以加载中的状态展示。 +2.`新增` slots:`chatNoMore`,支持自定义聊天记录模式没有更多数据view。 +3.`修复` 固定在底部view可能出现默认黄色的问题。 +4.`优化` 聊天记录加载更多样式,与普通模式对齐,支持点击加载更多&点击重试,并支持加载更多相关配置。 +5.`优化` 微调下拉刷新和底部加载更多样式。 +6.`优化` 聊天记录模式自动滚动到底部添加延时以避免可能出现的滚动到底部位置不正确的问题。 +7.`优化` 使用新的判断滚动到顶部算法以解决在安卓设备中可能出现的因滚动到顶部时scrollTop不为0导致的下拉刷新被禁用的问题。 +## 2.7.4(2024-01-14) +1.`新增` props:`auto-adjust-position-when-chat`,支持设置使用聊天记录模式中键盘弹出时是否自动调整slot="bottom"高度。 +2.`新增` props:`auto-to-bottom-when-chat`,支持设置使用聊天记录模式中键盘弹出时是否自动滚动到底部。 +3.`新增` props:`show-chat-loading-when-reload`,支持设置使用聊天记录模式中reload时是否显示chatLoading。 +4.`修复` 在聊天记录模式中`scrollIntoViewById`和`scrollIntoViewByNodeTop`无效的问题。 +5.`优化` 聊天记录模式底部安全区域针对键盘开启/关闭兼容处理。 +6.`优化` 更新内置的空数据图&加载失败图,感谢图鸟UI提供的免费可商用的空数据图和加载失败图! +## 2.7.3(2024-01-10) +1.`新增` 聊天记录模式支持虚拟列表&添加相关demo。 +2.`新增` nvue中list添加`@scrollend`监听。 +3.`优化` 聊天记录模式+vue第一页并且没有更多时不倒置列表。 +4.`优化` 聊天记录模式+nvue中数据不满屏时默认从顶部开始,不进行列表倒置。 +## 2.7.2(2024-01-09) +1.`修复` `vue3+h5`中报错`uni.onKeyboardHeightChange is not a function`的问题。 +2.`优化` 聊天记录模式细节:表情面板在触摸列表时隐藏&添加隐藏动画。 +## 2.7.1(2024-01-08) +1.`新增` `keyboardHeightChange` event,支持监听键盘高度改变。 +2.`新增` 聊天记录模式新增切换表情面板/键盘demo。 +3.`优化` 键盘弹出占位添加动画效果。 +## 2.7.0(2024-01-07) +2024新年快乐!!祝大家在新的一年里工作顺利,事事顺心! +1.`新增` 全新的聊天记录模式设计!将vue中的聊天记录模式与nvue中对齐,完全解决了聊天记录模式滚动到顶部加载更多在vue中抖动的问题,同时将聊天记录模式键盘自动弹出自动上推页面交由`z-paging`处理,解决了由此引发的各种问题,尤其是在微信小程序中导航栏被键盘顶出屏幕外的问题。如果您使用了`z-paging`的聊天记录模式,强烈建议更新,写法有一定变更,具体请参见demo。 +2.`新增` `swiper-demo`新增`onShow`时候调用reload演示。 +3.`修复` 修复滚动相关方法在微信小程序中首次滚动动画无效的问题。 +4.`修复` props设置单位,单位为px时报错的问题。 +5.`修复` 在某些情况下`z-paging`加载了但是未渲染时,reload无效的问题。 +6.`修复` 底部loading动画未生效的问题。 diff --git a/uni_modules/z-paging/components/z-paging-cell/z-paging-cell.vue b/uni_modules/z-paging/components/z-paging-cell/z-paging-cell.vue index 78ac6332..792126a3 100644 --- a/uni_modules/z-paging/components/z-paging-cell/z-paging-cell.vue +++ b/uni_modules/z-paging/components/z-paging-cell/z-paging-cell.vue @@ -1,39 +1,39 @@ - - - - - - - - - - + + + + + + + + + + diff --git a/uni_modules/z-paging/components/z-paging-empty-view/z-paging-empty-view.vue b/uni_modules/z-paging/components/z-paging-empty-view/z-paging-empty-view.vue index 31e32872..35d0304b 100644 --- a/uni_modules/z-paging/components/z-paging-empty-view/z-paging-empty-view.vue +++ b/uni_modules/z-paging/components/z-paging-empty-view/z-paging-empty-view.vue @@ -1,189 +1,189 @@ - - - - - - - - - - - + + + + + + + + + + + diff --git a/uni_modules/z-paging/components/z-paging-swiper-item/z-paging-swiper-item.vue b/uni_modules/z-paging/components/z-paging-swiper-item/z-paging-swiper-item.vue index 64a7bb08..7e15636d 100644 --- a/uni_modules/z-paging/components/z-paging-swiper-item/z-paging-swiper-item.vue +++ b/uni_modules/z-paging/components/z-paging-swiper-item/z-paging-swiper-item.vue @@ -1,143 +1,143 @@ - - - - - - - - - - - + + + + + + + + + + + diff --git a/uni_modules/z-paging/components/z-paging-swiper/z-paging-swiper.vue b/uni_modules/z-paging/components/z-paging-swiper/z-paging-swiper.vue index e965bed8..03374bdd 100644 --- a/uni_modules/z-paging/components/z-paging-swiper/z-paging-swiper.vue +++ b/uni_modules/z-paging/components/z-paging-swiper/z-paging-swiper.vue @@ -1,167 +1,167 @@ - - - - - - - - - - - + + + + + + + + + + + diff --git a/uni_modules/z-paging/components/z-paging/components/z-paging-load-more.vue b/uni_modules/z-paging/components/z-paging/components/z-paging-load-more.vue index 04ad7996..7ead6a7a 100644 --- a/uni_modules/z-paging/components/z-paging/components/z-paging-load-more.vue +++ b/uni_modules/z-paging/components/z-paging/components/z-paging-load-more.vue @@ -1,178 +1,178 @@ - - - - - + + + + + diff --git a/uni_modules/z-paging/components/z-paging/components/z-paging-refresh.vue b/uni_modules/z-paging/components/z-paging/components/z-paging-refresh.vue index 4a7ca61f..668005c8 100644 --- a/uni_modules/z-paging/components/z-paging/components/z-paging-refresh.vue +++ b/uni_modules/z-paging/components/z-paging/components/z-paging-refresh.vue @@ -1,208 +1,208 @@ - - - - - + + + + + diff --git a/uni_modules/z-paging/components/z-paging/config/index.js b/uni_modules/z-paging/components/z-paging/config/index.js index 15a37e22..794be28e 100644 --- a/uni_modules/z-paging/components/z-paging/config/index.js +++ b/uni_modules/z-paging/components/z-paging/config/index.js @@ -1,3 +1,3 @@ -// z-paging全局配置文件,注意避免更新时此文件被覆盖,若被覆盖,可在此文件中右键->点击本地历史记录,找回覆盖前的配置 - +// z-paging全局配置文件,注意避免更新时此文件被覆盖,若被覆盖,可在此文件中右键->点击本地历史记录,找回覆盖前的配置 + export default {} \ No newline at end of file diff --git a/uni_modules/z-paging/components/z-paging/css/z-paging-main.css b/uni_modules/z-paging/components/z-paging/css/z-paging-main.css index dce95fc9..db4ad461 100644 --- a/uni_modules/z-paging/components/z-paging/css/z-paging-main.css +++ b/uni_modules/z-paging/components/z-paging/css/z-paging-main.css @@ -1,237 +1,237 @@ -/* [z-paging]公共css*/ - -.z-paging-content { - position: relative; - flex-direction: column; - /* #ifndef APP-NVUE */ - overflow: hidden; - /* #endif */ -} - -.z-paging-content-full { - /* #ifndef APP-NVUE */ - display: flex; - width: 100%; - height: 100%; - /* #endif */ -} - -.z-paging-content-fixed, .zp-loading-fixed { - position: fixed; - /* #ifndef APP-NVUE */ - height: auto; - width: auto; - /* #endif */ - top: 0; - left: 0; - bottom: 0; - right: 0; -} - -.zp-f2-content { - width: 100%; - position: fixed; - top: 0; - left: 0; - background-color: white; -} - -.zp-page-top, .zp-page-bottom { - /* #ifndef APP-NVUE */ - width: auto; - /* #endif */ - position: fixed; - left: 0; - right: 0; - z-index: 999; -} - -.zp-page-left, .zp-page-right { - /* #ifndef APP-NVUE */ - height: 100%; - /* #endif */ -} - -.zp-scroll-view-super { - flex: 1; - overflow: hidden; - position: relative; -} - -.zp-view-super { - /* #ifndef APP-NVUE */ - display: flex; - /* #endif */ - flex-direction: row; -} - -.zp-scroll-view-container, .zp-scroll-view { - position: relative; - /* #ifndef APP-NVUE */ - height: 100%; - width: 100%; - /* #endif */ -} - -.zp-absoulte { - /* #ifndef APP-NVUE */ - position: absolute; - top: 0; - width: auto; - /* #endif */ -} - -.zp-scroll-view-absolute { - position: absolute; - top: 0; - left: 0; -} - -/* #ifndef APP-NVUE */ -.zp-scroll-view-hide-scrollbar ::-webkit-scrollbar { - display: none; - -webkit-appearance: none; - width: 0 !important; - height: 0 !important; - background: transparent; -} -/* #endif */ - -.zp-paging-touch-view { - width: 100%; - height: 100%; - position: relative; -} - -.zp-fixed-bac-view { - position: absolute; - width: 100%; - top: 0; - left: 0; - height: 200px; -} - -.zp-paging-main { - height: 100%; - /* #ifndef APP-NVUE */ - display: flex; - /* #endif */ - flex-direction: column; -} - -.zp-paging-container { - flex: 1; - position: relative; - /* #ifndef APP-NVUE */ - display: flex; - /* #endif */ - flex-direction: column; -} - -.zp-chat-record-loading-custom-image { - width: 35rpx; - height: 35rpx; - /* #ifndef APP-NVUE */ - animation: loading-flower 1s linear infinite; - /* #endif */ -} - -.zp-page-bottom-keyboard-placeholder-animate { - transition-property: height; - transition-duration: 0.15s; - /* #ifndef APP-NVUE */ - will-change: height; - /* #endif */ -} - -.zp-custom-refresher-container { - overflow: hidden; -} - -.zp-custom-refresher-refresh { - /* #ifndef APP-NVUE */ - display: block; - /* #endif */ -} - -.zp-back-to-top { - z-index: 999; - position: absolute; - bottom: 0rpx; - transition-duration: .3s; - transition-property: opacity; -} -.zp-back-to-top-rpx { - width: 76rpx; - height: 76rpx; - bottom: 0rpx; - right: 25rpx; -} -.zp-back-to-top-px { - width: 38px; - height: 38px; - bottom: 0px; - right: 13px; -} - -.zp-back-to-top-show { - opacity: 1; -} - -.zp-back-to-top-hide { - opacity: 0; -} - -.zp-back-to-top-img { - /* #ifndef APP-NVUE */ - width: 100%; - height: 100%; - /* #endif */ - /* #ifdef APP-NVUE */ - flex: 1; - /* #endif */ - z-index: 999; -} - -.zp-empty-view { - /* #ifdef APP-NVUE */ - height: 100%; - /* #endif */ - flex: 1; -} - -.zp-empty-view-center { - /* #ifndef APP-NVUE */ - display: flex; - /* #endif */ - flex-direction: column; - align-items: center; - justify-content: center; -} - -.zp-loading-fixed { - z-index: 9999; -} - -.zp-safe-area-inset-bottom { - position: absolute; - /* #ifndef APP-PLUS */ - height: env(safe-area-inset-bottom); - /* #endif */ -} - -.zp-n-refresh-container { - /* #ifndef APP-NVUE */ - display: flex; - /* #endif */ - justify-content: center; - width: 750rpx; -} - -.zp-n-list-container{ - /* #ifndef APP-NVUE */ - display: flex; - /* #endif */ - flex-direction: row; - flex: 1; -} +/* [z-paging]公共css*/ + +.z-paging-content { + position: relative; + flex-direction: column; + /* #ifndef APP-NVUE */ + overflow: hidden; + /* #endif */ +} + +.z-paging-content-full { + /* #ifndef APP-NVUE */ + display: flex; + width: 100%; + height: 100%; + /* #endif */ +} + +.z-paging-content-fixed, .zp-loading-fixed { + position: fixed; + /* #ifndef APP-NVUE */ + height: auto; + width: auto; + /* #endif */ + top: 0; + left: 0; + bottom: 0; + right: 0; +} + +.zp-f2-content { + width: 100%; + position: fixed; + top: 0; + left: 0; + background-color: white; +} + +.zp-page-top, .zp-page-bottom { + /* #ifndef APP-NVUE */ + width: auto; + /* #endif */ + position: fixed; + left: 0; + right: 0; + z-index: 999; +} + +.zp-page-left, .zp-page-right { + /* #ifndef APP-NVUE */ + height: 100%; + /* #endif */ +} + +.zp-scroll-view-super { + flex: 1; + overflow: hidden; + position: relative; +} + +.zp-view-super { + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: row; +} + +.zp-scroll-view-container, .zp-scroll-view { + position: relative; + /* #ifndef APP-NVUE */ + height: 100%; + width: 100%; + /* #endif */ +} + +.zp-absoulte { + /* #ifndef APP-NVUE */ + position: absolute; + top: 0; + width: auto; + /* #endif */ +} + +.zp-scroll-view-absolute { + position: absolute; + top: 0; + left: 0; +} + +/* #ifndef APP-NVUE */ +.zp-scroll-view-hide-scrollbar ::-webkit-scrollbar { + display: none; + -webkit-appearance: none; + width: 0 !important; + height: 0 !important; + background: transparent; +} +/* #endif */ + +.zp-paging-touch-view { + width: 100%; + height: 100%; + position: relative; +} + +.zp-fixed-bac-view { + position: absolute; + width: 100%; + top: 0; + left: 0; + height: 200px; +} + +.zp-paging-main { + height: 100%; + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: column; +} + +.zp-paging-container { + flex: 1; + position: relative; + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: column; +} + +.zp-chat-record-loading-custom-image { + width: 35rpx; + height: 35rpx; + /* #ifndef APP-NVUE */ + animation: loading-flower 1s linear infinite; + /* #endif */ +} + +.zp-page-bottom-keyboard-placeholder-animate { + transition-property: height; + transition-duration: 0.15s; + /* #ifndef APP-NVUE */ + will-change: height; + /* #endif */ +} + +.zp-custom-refresher-container { + overflow: hidden; +} + +.zp-custom-refresher-refresh { + /* #ifndef APP-NVUE */ + display: block; + /* #endif */ +} + +.zp-back-to-top { + z-index: 999; + position: absolute; + bottom: 0rpx; + transition-duration: .3s; + transition-property: opacity; +} +.zp-back-to-top-rpx { + width: 76rpx; + height: 76rpx; + bottom: 0rpx; + right: 25rpx; +} +.zp-back-to-top-px { + width: 38px; + height: 38px; + bottom: 0px; + right: 13px; +} + +.zp-back-to-top-show { + opacity: 1; +} + +.zp-back-to-top-hide { + opacity: 0; +} + +.zp-back-to-top-img { + /* #ifndef APP-NVUE */ + width: 100%; + height: 100%; + /* #endif */ + /* #ifdef APP-NVUE */ + flex: 1; + /* #endif */ + z-index: 999; +} + +.zp-empty-view { + /* #ifdef APP-NVUE */ + height: 100%; + /* #endif */ + flex: 1; +} + +.zp-empty-view-center { + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: column; + align-items: center; + justify-content: center; +} + +.zp-loading-fixed { + z-index: 9999; +} + +.zp-safe-area-inset-bottom { + position: absolute; + /* #ifndef APP-PLUS */ + height: env(safe-area-inset-bottom); + /* #endif */ +} + +.zp-n-refresh-container { + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + justify-content: center; + width: 750rpx; +} + +.zp-n-list-container{ + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: row; + flex: 1; +} diff --git a/uni_modules/z-paging/components/z-paging/css/z-paging-static.css b/uni_modules/z-paging/components/z-paging/css/z-paging-static.css index de445c20..50e40595 100644 --- a/uni_modules/z-paging/components/z-paging/css/z-paging-static.css +++ b/uni_modules/z-paging/components/z-paging/css/z-paging-static.css @@ -1,50 +1,50 @@ -/* [z-paging]公用的静态css资源 */ - -.zp-line-loading-image { - /* #ifndef APP-NVUE */ - animation: loading-flower 1s steps(12) infinite; - /* #endif */ - color: #666666; -} -.zp-line-loading-image-rpx { - margin-right: 8rpx; - width: 34rpx; - height: 34rpx; -} -.zp-line-loading-image-px { - margin-right: 4px; - width: 17px; - height: 17px; -} - -.zp-loading-image-ios-rpx { - width: 40rpx; - height: 40rpx; -} -.zp-loading-image-ios-px { - width: 20px; - height: 20px; -} - -.zp-loading-image-android-rpx { - width: 34rpx; - height: 34rpx; -} -.zp-loading-image-android-px { - width: 17px; - height: 17px; -} - -/* #ifndef APP-NVUE */ -@keyframes loading-flower { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - to { - -webkit-transform: rotate(1turn); - transform: rotate(1turn); - } -} -/* #endif */ - +/* [z-paging]公用的静态css资源 */ + +.zp-line-loading-image { + /* #ifndef APP-NVUE */ + animation: loading-flower 1s steps(12) infinite; + /* #endif */ + color: #666666; +} +.zp-line-loading-image-rpx { + margin-right: 8rpx; + width: 34rpx; + height: 34rpx; +} +.zp-line-loading-image-px { + margin-right: 4px; + width: 17px; + height: 17px; +} + +.zp-loading-image-ios-rpx { + width: 40rpx; + height: 40rpx; +} +.zp-loading-image-ios-px { + width: 20px; + height: 20px; +} + +.zp-loading-image-android-rpx { + width: 34rpx; + height: 34rpx; +} +.zp-loading-image-android-px { + width: 17px; + height: 17px; +} + +/* #ifndef APP-NVUE */ +@keyframes loading-flower { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + to { + -webkit-transform: rotate(1turn); + transform: rotate(1turn); + } +} +/* #endif */ + diff --git a/uni_modules/z-paging/components/z-paging/i18n/en.json b/uni_modules/z-paging/components/z-paging/i18n/en.json index 48fbe609..cb0a88cd 100644 --- a/uni_modules/z-paging/components/z-paging/i18n/en.json +++ b/uni_modules/z-paging/components/z-paging/i18n/en.json @@ -1,23 +1,23 @@ -{ - "zp.refresher.default": "Pull down to refresh", - "zp.refresher.pulling": "Release to refresh", - "zp.refresher.refreshing": "Refreshing...", - "zp.refresher.complete": "Refresh succeeded", - "zp.refresher.f2": "Refresh to enter 2f", - - "zp.loadingMore.default": "Click to load more", - "zp.loadingMore.loading": "Loading...", - "zp.loadingMore.noMore": "No more data", - "zp.loadingMore.fail": "Load failed,click to reload", - - "zp.emptyView.title": "No data", - "zp.emptyView.reload": "Reload", - "zp.emptyView.error": "Sorry,load failed", - - "zp.refresherUpdateTime.title": "Last update: ", - "zp.refresherUpdateTime.none": "None", - "zp.refresherUpdateTime.today": "Today", - "zp.refresherUpdateTime.yesterday": "Yesterday", - - "zp.systemLoading.title": "Loading..." -} +{ + "zp.refresher.default": "Pull down to refresh", + "zp.refresher.pulling": "Release to refresh", + "zp.refresher.refreshing": "Refreshing...", + "zp.refresher.complete": "Refresh succeeded", + "zp.refresher.f2": "Refresh to enter 2f", + + "zp.loadingMore.default": "Click to load more", + "zp.loadingMore.loading": "Loading...", + "zp.loadingMore.noMore": "No more data", + "zp.loadingMore.fail": "Load failed,click to reload", + + "zp.emptyView.title": "No data", + "zp.emptyView.reload": "Reload", + "zp.emptyView.error": "Sorry,load failed", + + "zp.refresherUpdateTime.title": "Last update: ", + "zp.refresherUpdateTime.none": "None", + "zp.refresherUpdateTime.today": "Today", + "zp.refresherUpdateTime.yesterday": "Yesterday", + + "zp.systemLoading.title": "Loading..." +} diff --git a/uni_modules/z-paging/components/z-paging/i18n/index.js b/uni_modules/z-paging/components/z-paging/i18n/index.js index de7509c8..d2afd081 100644 --- a/uni_modules/z-paging/components/z-paging/i18n/index.js +++ b/uni_modules/z-paging/components/z-paging/i18n/index.js @@ -1,8 +1,8 @@ -import en from './en.json' -import zhHans from './zh-Hans.json' -import zhHant from './zh-Hant.json' -export default { - en, - 'zh-Hans': zhHans, - 'zh-Hant': zhHant -} +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/z-paging/components/z-paging/i18n/zh-Hans.json b/uni_modules/z-paging/components/z-paging/i18n/zh-Hans.json index 440ca639..65a71d93 100644 --- a/uni_modules/z-paging/components/z-paging/i18n/zh-Hans.json +++ b/uni_modules/z-paging/components/z-paging/i18n/zh-Hans.json @@ -1,23 +1,23 @@ -{ - "zp.refresher.default": "继续下拉刷新", - "zp.refresher.pulling": "松开立即刷新", - "zp.refresher.refreshing": "正在刷新...", - "zp.refresher.complete": "刷新成功", - "zp.refresher.f2": "松手进入二楼", - - "zp.loadingMore.default": "点击加载更多", - "zp.loadingMore.loading": "正在加载...", - "zp.loadingMore.noMore": "没有更多了", - "zp.loadingMore.fail": "加载失败,点击重新加载", - - "zp.emptyView.title": "没有数据哦~", - "zp.emptyView.reload": "重新加载", - "zp.emptyView.error": "很抱歉,加载失败", - - "zp.refresherUpdateTime.title": "最后更新:", - "zp.refresherUpdateTime.none": "无", - "zp.refresherUpdateTime.today": "今天", - "zp.refresherUpdateTime.yesterday": "昨天", - - "zp.systemLoading.title": "加载中..." -} +{ + "zp.refresher.default": "继续下拉刷新", + "zp.refresher.pulling": "松开立即刷新", + "zp.refresher.refreshing": "正在刷新...", + "zp.refresher.complete": "刷新成功", + "zp.refresher.f2": "松手进入二楼", + + "zp.loadingMore.default": "点击加载更多", + "zp.loadingMore.loading": "正在加载...", + "zp.loadingMore.noMore": "没有更多了", + "zp.loadingMore.fail": "加载失败,点击重新加载", + + "zp.emptyView.title": "没有数据哦~", + "zp.emptyView.reload": "重新加载", + "zp.emptyView.error": "很抱歉,加载失败", + + "zp.refresherUpdateTime.title": "最后更新:", + "zp.refresherUpdateTime.none": "无", + "zp.refresherUpdateTime.today": "今天", + "zp.refresherUpdateTime.yesterday": "昨天", + + "zp.systemLoading.title": "加载中..." +} diff --git a/uni_modules/z-paging/components/z-paging/i18n/zh-Hant.json b/uni_modules/z-paging/components/z-paging/i18n/zh-Hant.json index b3d55025..c8adca9f 100644 --- a/uni_modules/z-paging/components/z-paging/i18n/zh-Hant.json +++ b/uni_modules/z-paging/components/z-paging/i18n/zh-Hant.json @@ -1,23 +1,23 @@ -{ - "zp.refresher.default": "繼續下拉重繪", - "zp.refresher.pulling": "鬆開立即重繪", - "zp.refresher.refreshing": "正在重繪...", - "zp.refresher.complete": "重繪成功", - "zp.refresher.f2": "鬆手進入二樓", - - "zp.loadingMore.default": "點擊加載更多", - "zp.loadingMore.loading": "正在加載...", - "zp.loadingMore.noMore": "沒有更多了", - "zp.loadingMore.fail": "加載失敗,點擊重新加載", - - "zp.emptyView.title": "沒有數據哦~", - "zp.emptyView.reload": "重新加載", - "zp.emptyView.error": "很抱歉,加載失敗", - - "zp.refresherUpdateTime.title": "最後更新:", - "zp.refresherUpdateTime.none": "無", - "zp.refresherUpdateTime.today": "今天", - "zp.refresherUpdateTime.yesterday": "昨天", - - "zp.systemLoading.title": "加載中..." -} +{ + "zp.refresher.default": "繼續下拉重繪", + "zp.refresher.pulling": "鬆開立即重繪", + "zp.refresher.refreshing": "正在重繪...", + "zp.refresher.complete": "重繪成功", + "zp.refresher.f2": "鬆手進入二樓", + + "zp.loadingMore.default": "點擊加載更多", + "zp.loadingMore.loading": "正在加載...", + "zp.loadingMore.noMore": "沒有更多了", + "zp.loadingMore.fail": "加載失敗,點擊重新加載", + + "zp.emptyView.title": "沒有數據哦~", + "zp.emptyView.reload": "重新加載", + "zp.emptyView.error": "很抱歉,加載失敗", + + "zp.refresherUpdateTime.title": "最後更新:", + "zp.refresherUpdateTime.none": "無", + "zp.refresherUpdateTime.today": "今天", + "zp.refresherUpdateTime.yesterday": "昨天", + + "zp.systemLoading.title": "加載中..." +} diff --git a/uni_modules/z-paging/components/z-paging/js/hooks/useZPaging.js b/uni_modules/z-paging/components/z-paging/js/hooks/useZPaging.js index adb6e1be..46f799e7 100644 --- a/uni_modules/z-paging/components/z-paging/js/hooks/useZPaging.js +++ b/uni_modules/z-paging/components/z-paging/js/hooks/useZPaging.js @@ -1,25 +1,25 @@ -// [z-paging]useZPaging hooks - -import { onPageScroll, onReachBottom, onPullDownRefresh } from '@dcloudio/uni-app'; - -function useZPaging(paging) { - const cPaging = !!paging ? paging.value || paging : null; - - onPullDownRefresh(() => { - if (!cPaging || !cPaging.value) return; - cPaging.value.reload().catch(() => {}); - }) - - onPageScroll(e => { - if (!cPaging || !cPaging.value) return; - cPaging.value.updatePageScrollTop(e.scrollTop); - e.scrollTop < 10 && cPaging.value.doChatRecordLoadMore(); - }) - - onReachBottom(() => { - if (!cPaging || !cPaging.value) return; - cPaging.value.pageReachBottom(); - }) -} - +// [z-paging]useZPaging hooks + +import { onPageScroll, onReachBottom, onPullDownRefresh } from '@dcloudio/uni-app'; + +function useZPaging(paging) { + const cPaging = !!paging ? paging.value || paging : null; + + onPullDownRefresh(() => { + if (!cPaging || !cPaging.value) return; + cPaging.value.reload().catch(() => {}); + }) + + onPageScroll(e => { + if (!cPaging || !cPaging.value) return; + cPaging.value.updatePageScrollTop(e.scrollTop); + e.scrollTop < 10 && cPaging.value.doChatRecordLoadMore(); + }) + + onReachBottom(() => { + if (!cPaging || !cPaging.value) return; + cPaging.value.pageReachBottom(); + }) +} + export default useZPaging \ No newline at end of file diff --git a/uni_modules/z-paging/components/z-paging/js/hooks/useZPagingComp.js b/uni_modules/z-paging/components/z-paging/js/hooks/useZPagingComp.js index f9bc5abb..f281bc22 100644 --- a/uni_modules/z-paging/components/z-paging/js/hooks/useZPagingComp.js +++ b/uni_modules/z-paging/components/z-paging/js/hooks/useZPagingComp.js @@ -1,25 +1,25 @@ -// [z-paging]useZPagingComp hooks - -function useZPagingComp(paging) { - const cPaging = !!paging ? paging.value || paging : null; - - const reload = () => { - if (!cPaging || !cPaging.value) return; - cPaging.value.reload().catch(() => {}); - } - const updatePageScrollTop = scrollTop => { - if (!cPaging || !cPaging.value) return; - cPaging.value.updatePageScrollTop(scrollTop); - } - const doChatRecordLoadMore = () => { - if (!cPaging || !cPaging.value) return; - cPaging.value.doChatRecordLoadMore(); - } - const pageReachBottom = () => { - if (!cPaging || !cPaging.value) return; - cPaging.value.pageReachBottom(); - } - return { reload, updatePageScrollTop, doChatRecordLoadMore, pageReachBottom }; -} - +// [z-paging]useZPagingComp hooks + +function useZPagingComp(paging) { + const cPaging = !!paging ? paging.value || paging : null; + + const reload = () => { + if (!cPaging || !cPaging.value) return; + cPaging.value.reload().catch(() => {}); + } + const updatePageScrollTop = scrollTop => { + if (!cPaging || !cPaging.value) return; + cPaging.value.updatePageScrollTop(scrollTop); + } + const doChatRecordLoadMore = () => { + if (!cPaging || !cPaging.value) return; + cPaging.value.doChatRecordLoadMore(); + } + const pageReachBottom = () => { + if (!cPaging || !cPaging.value) return; + cPaging.value.pageReachBottom(); + } + return { reload, updatePageScrollTop, doChatRecordLoadMore, pageReachBottom }; +} + export default useZPagingComp \ No newline at end of file diff --git a/uni_modules/z-paging/components/z-paging/js/modules/back-to-top.js b/uni_modules/z-paging/components/z-paging/js/modules/back-to-top.js index 44f2dd7f..bcab5c9f 100644 --- a/uni_modules/z-paging/components/z-paging/js/modules/back-to-top.js +++ b/uni_modules/z-paging/components/z-paging/js/modules/back-to-top.js @@ -1,125 +1,125 @@ -// [z-paging]点击返回顶部view模块 -import u from '.././z-paging-utils' - -export default { - props: { - // 自动显示点击返回顶部按钮,默认为否 - autoShowBackToTop: { - type: Boolean, - default: u.gc('autoShowBackToTop', false) - }, - // 点击返回顶部按钮显示/隐藏的阈值(滚动距离),单位为px,默认为400rpx - backToTopThreshold: { - type: [Number, String], - default: u.gc('backToTopThreshold', '400rpx') - }, - // 点击返回顶部按钮的自定义图片地址,默认使用z-paging内置的图片 - backToTopImg: { - type: String, - default: u.gc('backToTopImg', '') - }, - // 点击返回顶部按钮返回到顶部时是否展示过渡动画,默认为是 - backToTopWithAnimate: { - type: Boolean, - default: u.gc('backToTopWithAnimate', true) - }, - // 点击返回顶部按钮与底部的距离,注意添加单位px或rpx,默认为160rpx - backToTopBottom: { - type: [Number, String], - default: u.gc('backToTopBottom', '160rpx') - }, - // 点击返回顶部按钮的自定义样式 - backToTopStyle: { - type: Object, - default: u.gc('backToTopStyle', {}), - }, - // iOS点击顶部状态栏、安卓双击标题栏时,滚动条返回顶部,只支持竖向,默认为是 - enableBackToTop: { - type: Boolean, - default: u.gc('enableBackToTop', true) - }, - }, - data() { - return { - // 点击返回顶部的class - backToTopClass: 'zp-back-to-top zp-back-to-top-hide', - // 上次点击返回顶部的时间 - lastBackToTopShowTime: 0, - // 点击返回顶部显示的class是否在展示中,使得按钮展示/隐藏过度效果更自然 - showBackToTopClass: false, - } - }, - computed: { - backToTopThresholdUnitConverted() { - return u.addUnit(this.backToTopThreshold, this.unit); - }, - backToTopBottomUnitConverted() { - return u.addUnit(this.backToTopBottom, this.unit); - }, - finalEnableBackToTop() { - return this.usePageScroll ? false : this.enableBackToTop; - }, - finalBackToTopThreshold() { - return u.convertToPx(this.backToTopThresholdUnitConverted); - }, - finalBackToTopStyle() { - const backToTopStyle = this.backToTopStyle; - if (!backToTopStyle.bottom) { - backToTopStyle.bottom = this.windowBottom + u.convertToPx(this.backToTopBottomUnitConverted) + 'px'; - } - if(!backToTopStyle.position){ - backToTopStyle.position = this.usePageScroll ? 'fixed': 'absolute'; - } - return backToTopStyle; - }, - finalBackToTopClass() { - return `${this.backToTopClass} zp-back-to-top-${this.unit}`; - } - }, - methods: { - // 点击了返回顶部 - _backToTopClick() { - let callbacked = false; - this.$emit('backToTopClick', toTop => { - (toTop === undefined || toTop === true) && this._handleToTop(); - callbacked = true; - }); - // 如果用户没有禁止默认的返回顶部事件,则触发滚动到顶部 - this.$nextTick(() => { - !callbacked && this._handleToTop(); - }) - }, - // 处理滚动到顶部 - _handleToTop() { - !this.backToTopWithAnimate && this._checkShouldShowBackToTop(0); - this.scrollToTop(this.backToTopWithAnimate); - }, - // 判断是否要显示返回顶部按钮 - _checkShouldShowBackToTop(scrollTop) { - if (!this.autoShowBackToTop) { - this.showBackToTopClass = false; - return; - } - if (scrollTop > this.finalBackToTopThreshold) { - if (!this.showBackToTopClass) { - // 记录当前点击返回顶部按钮显示的class生效了 - this.showBackToTopClass = true; - this.lastBackToTopShowTime = new Date().getTime(); - // 当滚动到需要展示返回顶部的阈值内,则延迟300毫秒展示返回到顶部按钮 - u.delay(() => { - this.backToTopClass = 'zp-back-to-top zp-back-to-top-show'; - }, 300) - } - } else { - // 如果当前点击返回顶部按钮显示的class是生效状态并且滚动小于触发阈值,则隐藏返回顶部按钮 - if (this.showBackToTopClass) { - this.backToTopClass = 'zp-back-to-top zp-back-to-top-hide'; - u.delay(() => { - this.showBackToTopClass = false; - }, new Date().getTime() - this.lastBackToTopShowTime < 500 ? 0 : 300) - } - } - }, - } -} - +// [z-paging]点击返回顶部view模块 +import u from '.././z-paging-utils' + +export default { + props: { + // 自动显示点击返回顶部按钮,默认为否 + autoShowBackToTop: { + type: Boolean, + default: u.gc('autoShowBackToTop', false) + }, + // 点击返回顶部按钮显示/隐藏的阈值(滚动距离),单位为px,默认为400rpx + backToTopThreshold: { + type: [Number, String], + default: u.gc('backToTopThreshold', '400rpx') + }, + // 点击返回顶部按钮的自定义图片地址,默认使用z-paging内置的图片 + backToTopImg: { + type: String, + default: u.gc('backToTopImg', '') + }, + // 点击返回顶部按钮返回到顶部时是否展示过渡动画,默认为是 + backToTopWithAnimate: { + type: Boolean, + default: u.gc('backToTopWithAnimate', true) + }, + // 点击返回顶部按钮与底部的距离,注意添加单位px或rpx,默认为160rpx + backToTopBottom: { + type: [Number, String], + default: u.gc('backToTopBottom', '160rpx') + }, + // 点击返回顶部按钮的自定义样式 + backToTopStyle: { + type: Object, + default: u.gc('backToTopStyle', {}), + }, + // iOS点击顶部状态栏、安卓双击标题栏时,滚动条返回顶部,只支持竖向,默认为是 + enableBackToTop: { + type: Boolean, + default: u.gc('enableBackToTop', true) + }, + }, + data() { + return { + // 点击返回顶部的class + backToTopClass: 'zp-back-to-top zp-back-to-top-hide', + // 上次点击返回顶部的时间 + lastBackToTopShowTime: 0, + // 点击返回顶部显示的class是否在展示中,使得按钮展示/隐藏过度效果更自然 + showBackToTopClass: false, + } + }, + computed: { + backToTopThresholdUnitConverted() { + return u.addUnit(this.backToTopThreshold, this.unit); + }, + backToTopBottomUnitConverted() { + return u.addUnit(this.backToTopBottom, this.unit); + }, + finalEnableBackToTop() { + return this.usePageScroll ? false : this.enableBackToTop; + }, + finalBackToTopThreshold() { + return u.convertToPx(this.backToTopThresholdUnitConverted); + }, + finalBackToTopStyle() { + const backToTopStyle = this.backToTopStyle; + if (!backToTopStyle.bottom) { + backToTopStyle.bottom = this.windowBottom + u.convertToPx(this.backToTopBottomUnitConverted) + 'px'; + } + if(!backToTopStyle.position){ + backToTopStyle.position = this.usePageScroll ? 'fixed': 'absolute'; + } + return backToTopStyle; + }, + finalBackToTopClass() { + return `${this.backToTopClass} zp-back-to-top-${this.unit}`; + } + }, + methods: { + // 点击了返回顶部 + _backToTopClick() { + let callbacked = false; + this.$emit('backToTopClick', toTop => { + (toTop === undefined || toTop === true) && this._handleToTop(); + callbacked = true; + }); + // 如果用户没有禁止默认的返回顶部事件,则触发滚动到顶部 + this.$nextTick(() => { + !callbacked && this._handleToTop(); + }) + }, + // 处理滚动到顶部 + _handleToTop() { + !this.backToTopWithAnimate && this._checkShouldShowBackToTop(0); + this.scrollToTop(this.backToTopWithAnimate); + }, + // 判断是否要显示返回顶部按钮 + _checkShouldShowBackToTop(scrollTop) { + if (!this.autoShowBackToTop) { + this.showBackToTopClass = false; + return; + } + if (scrollTop > this.finalBackToTopThreshold) { + if (!this.showBackToTopClass) { + // 记录当前点击返回顶部按钮显示的class生效了 + this.showBackToTopClass = true; + this.lastBackToTopShowTime = new Date().getTime(); + // 当滚动到需要展示返回顶部的阈值内,则延迟300毫秒展示返回到顶部按钮 + u.delay(() => { + this.backToTopClass = 'zp-back-to-top zp-back-to-top-show'; + }, 300) + } + } else { + // 如果当前点击返回顶部按钮显示的class是生效状态并且滚动小于触发阈值,则隐藏返回顶部按钮 + if (this.showBackToTopClass) { + this.backToTopClass = 'zp-back-to-top zp-back-to-top-hide'; + u.delay(() => { + this.showBackToTopClass = false; + }, new Date().getTime() - this.lastBackToTopShowTime < 500 ? 0 : 300) + } + } + }, + } +} + diff --git a/uni_modules/z-paging/components/z-paging/js/modules/chat-record-mode.js b/uni_modules/z-paging/components/z-paging/js/modules/chat-record-mode.js index daacf0c2..261daad1 100644 --- a/uni_modules/z-paging/components/z-paging/js/modules/chat-record-mode.js +++ b/uni_modules/z-paging/components/z-paging/js/modules/chat-record-mode.js @@ -1,149 +1,149 @@ -// [z-paging]聊天记录模式模块 -import u from '.././z-paging-utils' - -export default { - props: { - // 使用聊天记录模式,默认为否 - useChatRecordMode: { - type: Boolean, - default: u.gc('useChatRecordMode', false) - }, - // 使用聊天记录模式时滚动到顶部后,列表垂直移动偏移距离。默认0rpx。单位px(暂时无效) - chatRecordMoreOffset: { - type: [Number, String], - default: u.gc('chatRecordMoreOffset', '0rpx') - }, - // 使用聊天记录模式时是否自动隐藏键盘:在用户触摸列表时候自动隐藏键盘,默认为是 - autoHideKeyboardWhenChat: { - type: Boolean, - default: u.gc('autoHideKeyboardWhenChat', true) - }, - // 使用聊天记录模式中键盘弹出时是否自动调整slot="bottom"高度,默认为是 - autoAdjustPositionWhenChat: { - type: Boolean, - default: u.gc('autoAdjustPositionWhenChat', true) - }, - // 使用聊天记录模式中键盘弹出时占位高度偏移距离。默认0rpx。单位px - chatAdjustPositionOffset: { - type: [Number, String], - default: u.gc('chatAdjustPositionOffset', '0rpx') - }, - // 使用聊天记录模式中键盘弹出时是否自动滚动到底部,默认为否 - autoToBottomWhenChat: { - type: Boolean, - default: u.gc('autoToBottomWhenChat', false) - }, - // 使用聊天记录模式中reload时是否显示chatLoading,默认为否 - showChatLoadingWhenReload: { - type: Boolean, - default: u.gc('showChatLoadingWhenReload', false) - }, - // 在聊天记录模式中滑动到顶部状态为默认状态时,以加载中的状态展示,默认为是。若设置为否,则默认会显示【点击加载更多】,然后才会显示loading - chatLoadingMoreDefaultAsLoading: { - type: Boolean, - default: u.gc('chatLoadingMoreDefaultAsLoading', true) - }, - }, - data() { - return { - // 键盘高度 - keyboardHeight: 0, - // 键盘高度是否未改变,此时占位高度变化不需要动画效果 - isKeyboardHeightChanged: false, - } - }, - computed: { - finalChatRecordMoreOffset() { - return u.convertToPx(this.chatRecordMoreOffset); - }, - finalChatAdjustPositionOffset() { - return u.convertToPx(this.chatAdjustPositionOffset); - }, - // 聊天记录模式旋转180度style - chatRecordRotateStyle() { - let cellStyle; - // 在vue中,直接将列表倒置,因此在vue的cell中,也直接写style="transform: scaleY(-1)"转回来即可。 - // #ifndef APP-NVUE - cellStyle = this.useChatRecordMode ? { transform: 'scaleY(-1)' } : {}; - // #endif - - // 在nvue中,需要考虑数据量不满一页的情况,因为nvue中的list无法通过flex-end修改不满一页的起始位置,会导致不满一页时列表数据从底部开始,因此需要特别判断 - // 当数据不满一屏的时候,不进行列表倒置 - // #ifdef APP-NVUE - cellStyle = this.useChatRecordMode ? { transform: this.isFirstPageAndNoMore ? 'scaleY(1)' : 'scaleY(-1)' } : {}; - // #endif - - this.$emit('update:cellStyle', cellStyle); - this.$emit('cellStyleChange', cellStyle); - - // 在聊天记录模式中,如果列表没有倒置并且当前是第一页,则需要自动滚动到最底部 - this.$nextTick(() => { - if (this.isFirstPage && this.isChatRecordModeAndNotInversion) { - this.$nextTick(() => { - // 这里多次触发滚动到底部是为了避免在某些情况下,即使是在nextTick但是cell未渲染完毕导致滚动到底部位置不正确的问题 - this._scrollToBottom(false); - u.delay(() => { - this._scrollToBottom(false); - u.delay(() => { - this._scrollToBottom(false); - }, 50) - }, 50) - }) - } - }) - return cellStyle; - }, - // 是否是聊天记录列表并且有配置transform - isChatRecordModeHasTransform() { - return this.useChatRecordMode && this.chatRecordRotateStyle && this.chatRecordRotateStyle.transform; - }, - // 是否是聊天记录列表并且列表未倒置 - isChatRecordModeAndNotInversion() { - return this.isChatRecordModeHasTransform && this.chatRecordRotateStyle.transform === 'scaleY(1)'; - }, - // 是否是聊天记录列表并且列表倒置 - isChatRecordModeAndInversion() { - return this.isChatRecordModeHasTransform && this.chatRecordRotateStyle.transform === 'scaleY(-1)'; - }, - // 最终的聊天记录模式中底部安全区域的高度,如果开启了底部安全区域并且键盘未弹出,则添加底部区域高度 - chatRecordModeSafeAreaBottom() { - return this.safeAreaInsetBottom && !this.keyboardHeight ? this.safeAreaBottom : 0; - } - }, - mounted() { - // 监听键盘高度变化(H5、百度小程序、抖音小程序、飞书小程序不支持) - // #ifndef H5 || MP-BAIDU || MP-TOUTIAO - if (this.useChatRecordMode) { - uni.onKeyboardHeightChange(this._handleKeyboardHeightChange); - } - // #endif - }, - methods: { - // 添加聊天记录 - addChatRecordData(data, toBottom = true, toBottomWithAnimate = true) { - if (!this.useChatRecordMode) return; - this.isTotalChangeFromAddData = true; - this.addDataFromTop(data, toBottom, toBottomWithAnimate); - }, - // 手动触发滚动到顶部加载更多,聊天记录模式时有效 - doChatRecordLoadMore() { - this.useChatRecordMode && this._onLoadingMore('click'); - }, - // 处理键盘高度变化 - _handleKeyboardHeightChange(res) { - this.$emit('keyboardHeightChange', res); - if (this.autoAdjustPositionWhenChat) { - this.isKeyboardHeightChanged = true; - this.keyboardHeight = res.height > 0 ? res.height + this.finalChatAdjustPositionOffset : res.height; - } - if (this.autoToBottomWhenChat && this.keyboardHeight > 0) { - u.delay(() => { - this.scrollToBottom(false); - u.delay(() => { - this.scrollToBottom(false); - }) - }) - } - } - } -} +// [z-paging]聊天记录模式模块 +import u from '.././z-paging-utils' + +export default { + props: { + // 使用聊天记录模式,默认为否 + useChatRecordMode: { + type: Boolean, + default: u.gc('useChatRecordMode', false) + }, + // 使用聊天记录模式时滚动到顶部后,列表垂直移动偏移距离。默认0rpx。单位px(暂时无效) + chatRecordMoreOffset: { + type: [Number, String], + default: u.gc('chatRecordMoreOffset', '0rpx') + }, + // 使用聊天记录模式时是否自动隐藏键盘:在用户触摸列表时候自动隐藏键盘,默认为是 + autoHideKeyboardWhenChat: { + type: Boolean, + default: u.gc('autoHideKeyboardWhenChat', true) + }, + // 使用聊天记录模式中键盘弹出时是否自动调整slot="bottom"高度,默认为是 + autoAdjustPositionWhenChat: { + type: Boolean, + default: u.gc('autoAdjustPositionWhenChat', true) + }, + // 使用聊天记录模式中键盘弹出时占位高度偏移距离。默认0rpx。单位px + chatAdjustPositionOffset: { + type: [Number, String], + default: u.gc('chatAdjustPositionOffset', '0rpx') + }, + // 使用聊天记录模式中键盘弹出时是否自动滚动到底部,默认为否 + autoToBottomWhenChat: { + type: Boolean, + default: u.gc('autoToBottomWhenChat', false) + }, + // 使用聊天记录模式中reload时是否显示chatLoading,默认为否 + showChatLoadingWhenReload: { + type: Boolean, + default: u.gc('showChatLoadingWhenReload', false) + }, + // 在聊天记录模式中滑动到顶部状态为默认状态时,以加载中的状态展示,默认为是。若设置为否,则默认会显示【点击加载更多】,然后才会显示loading + chatLoadingMoreDefaultAsLoading: { + type: Boolean, + default: u.gc('chatLoadingMoreDefaultAsLoading', true) + }, + }, + data() { + return { + // 键盘高度 + keyboardHeight: 0, + // 键盘高度是否未改变,此时占位高度变化不需要动画效果 + isKeyboardHeightChanged: false, + } + }, + computed: { + finalChatRecordMoreOffset() { + return u.convertToPx(this.chatRecordMoreOffset); + }, + finalChatAdjustPositionOffset() { + return u.convertToPx(this.chatAdjustPositionOffset); + }, + // 聊天记录模式旋转180度style + chatRecordRotateStyle() { + let cellStyle; + // 在vue中,直接将列表倒置,因此在vue的cell中,也直接写style="transform: scaleY(-1)"转回来即可。 + // #ifndef APP-NVUE + cellStyle = this.useChatRecordMode ? { transform: 'scaleY(-1)' } : {}; + // #endif + + // 在nvue中,需要考虑数据量不满一页的情况,因为nvue中的list无法通过flex-end修改不满一页的起始位置,会导致不满一页时列表数据从底部开始,因此需要特别判断 + // 当数据不满一屏的时候,不进行列表倒置 + // #ifdef APP-NVUE + cellStyle = this.useChatRecordMode ? { transform: this.isFirstPageAndNoMore ? 'scaleY(1)' : 'scaleY(-1)' } : {}; + // #endif + + this.$emit('update:cellStyle', cellStyle); + this.$emit('cellStyleChange', cellStyle); + + // 在聊天记录模式中,如果列表没有倒置并且当前是第一页,则需要自动滚动到最底部 + this.$nextTick(() => { + if (this.isFirstPage && this.isChatRecordModeAndNotInversion) { + this.$nextTick(() => { + // 这里多次触发滚动到底部是为了避免在某些情况下,即使是在nextTick但是cell未渲染完毕导致滚动到底部位置不正确的问题 + this._scrollToBottom(false); + u.delay(() => { + this._scrollToBottom(false); + u.delay(() => { + this._scrollToBottom(false); + }, 50) + }, 50) + }) + } + }) + return cellStyle; + }, + // 是否是聊天记录列表并且有配置transform + isChatRecordModeHasTransform() { + return this.useChatRecordMode && this.chatRecordRotateStyle && this.chatRecordRotateStyle.transform; + }, + // 是否是聊天记录列表并且列表未倒置 + isChatRecordModeAndNotInversion() { + return this.isChatRecordModeHasTransform && this.chatRecordRotateStyle.transform === 'scaleY(1)'; + }, + // 是否是聊天记录列表并且列表倒置 + isChatRecordModeAndInversion() { + return this.isChatRecordModeHasTransform && this.chatRecordRotateStyle.transform === 'scaleY(-1)'; + }, + // 最终的聊天记录模式中底部安全区域的高度,如果开启了底部安全区域并且键盘未弹出,则添加底部区域高度 + chatRecordModeSafeAreaBottom() { + return this.safeAreaInsetBottom && !this.keyboardHeight ? this.safeAreaBottom : 0; + } + }, + mounted() { + // 监听键盘高度变化(H5、百度小程序、抖音小程序、飞书小程序不支持) + // #ifndef H5 || MP-BAIDU || MP-TOUTIAO + if (this.useChatRecordMode) { + uni.onKeyboardHeightChange(this._handleKeyboardHeightChange); + } + // #endif + }, + methods: { + // 添加聊天记录 + addChatRecordData(data, toBottom = true, toBottomWithAnimate = true) { + if (!this.useChatRecordMode) return; + this.isTotalChangeFromAddData = true; + this.addDataFromTop(data, toBottom, toBottomWithAnimate); + }, + // 手动触发滚动到顶部加载更多,聊天记录模式时有效 + doChatRecordLoadMore() { + this.useChatRecordMode && this._onLoadingMore('click'); + }, + // 处理键盘高度变化 + _handleKeyboardHeightChange(res) { + this.$emit('keyboardHeightChange', res); + if (this.autoAdjustPositionWhenChat) { + this.isKeyboardHeightChanged = true; + this.keyboardHeight = res.height > 0 ? res.height + this.finalChatAdjustPositionOffset : res.height; + } + if (this.autoToBottomWhenChat && this.keyboardHeight > 0) { + u.delay(() => { + this.scrollToBottom(false); + u.delay(() => { + this.scrollToBottom(false); + }) + }) + } + } + } +} diff --git a/uni_modules/z-paging/components/z-paging/js/modules/common-layout.js b/uni_modules/z-paging/components/z-paging/js/modules/common-layout.js index c4933ed3..b587f720 100644 --- a/uni_modules/z-paging/components/z-paging/js/modules/common-layout.js +++ b/uni_modules/z-paging/components/z-paging/js/modules/common-layout.js @@ -1,141 +1,141 @@ -// [z-paging]通用布局相关模块 - -// #ifdef APP-NVUE -const weexDom = weex.requireModule('dom'); -// #endif - -export default { - data() { - return { - systemInfo: null, - cssSafeAreaInsetBottom: -1, - isReadyDestroy: false, - } - }, - computed: { - // 顶部可用距离 - windowTop() { - if (!this.systemInfo) return 0; - // 暂时修复vue3中隐藏系统导航栏后windowTop获取不正确的问题,具体bug详见https://ask.dcloud.net.cn/question/141634 - // 感谢litangyu!!https://github.com/SmileZXLee/uni-z-paging/issues/25 - // #ifdef VUE3 && H5 - const pageHeadNode = document.getElementsByTagName("uni-page-head"); - if (!pageHeadNode.length) return 0; - // #endif - return this.systemInfo.windowTop || 0; - }, - // 底部安全区域高度 - safeAreaBottom() { - if (!this.systemInfo) return 0; - let safeAreaBottom = 0; - // #ifdef APP-PLUS - safeAreaBottom = this.systemInfo.safeAreaInsets.bottom || 0 ; - // #endif - // #ifndef APP-PLUS - safeAreaBottom = Math.max(this.cssSafeAreaInsetBottom, 0); - // #endif - return safeAreaBottom; - }, - // 是否是比较老的webview,在一些老的webview中,需要进行一些特殊处理 - isOldWebView() { - // #ifndef APP-NVUE || MP-KUAISHOU - try { - const systemInfos = uni.getSystemInfoSync().system.split(' '); - const deviceType = systemInfos[0]; - const version = parseInt(systemInfos[1]); - if ((deviceType === 'iOS' && version <= 10) || (deviceType === 'Android' && version <= 6)) { - return true; - } - } catch(e) { - return false; - } - // #endif - return false; - }, - // 当前组件的$slots,兼容不同平台 - zSlots() { - // #ifdef VUE2 - - // #ifdef MP-ALIPAY - return this.$slots; - // #endif - - return this.$scopedSlots || this.$slots; - // #endif - - return this.$slots; - }, - }, - beforeDestroy() { - this.isReadyDestroy = true; - }, - // #ifdef VUE3 - unmounted() { - this.isReadyDestroy = true; - }, - // #endif - methods: { - // 更新fixed模式下z-paging的布局 - updateFixedLayout() { - this.fixed && this.$nextTick(() => { - this.systemInfo = uni.getSystemInfoSync(); - }) - }, - // 获取节点尺寸 - _getNodeClientRect(select, inDom = true, scrollOffset = false) { - if (this.isReadyDestroy) { - return Promise.resolve(false); - }; - // nvue中获取节点信息 - // #ifdef APP-NVUE - select = select.replace(/[.|#]/g, ''); - const ref = this.$refs[select]; - return new Promise((resolve, reject) => { - if (ref) { - weexDom.getComponentRect(ref, option => { - resolve(option && option.result ? [option.size] : false); - }) - } else { - resolve(false); - } - }); - return; - // #endif - - // vue中获取节点信息 - //#ifdef MP-ALIPAY - inDom = false; - //#endif - let res = !!inDom ? uni.createSelectorQuery().in(inDom === true ? this : inDom) : uni.createSelectorQuery(); - scrollOffset ? res.select(select).scrollOffset() : res.select(select).boundingClientRect(); - return new Promise((resolve, reject) => { - res.exec(data => { - resolve((data && data != '' && data != undefined && data.length) ? data : false); - }); - }); - }, - // 获取slot="left"和slot="right"宽度并且更新布局 - _updateLeftAndRightWidth(targetStyle, parentNodePrefix) { - this.$nextTick(() => { - let delayTime = 0; - // #ifdef MP-BAIDU - delayTime = 10; - // #endif - setTimeout(() => { - ['left','right'].map(position => { - this._getNodeClientRect(`.${parentNodePrefix}-${position}`).then(res => { - this.$set(targetStyle, position, res ? res[0].width + 'px' : '0px'); - }); - }) - }, delayTime) - }) - }, - // 通过获取css设置的底部安全区域占位view高度设置bottom距离(直接通过systemInfo在部分平台上无法获取到底部安全区域) - _getCssSafeAreaInsetBottom(success) { - this._getNodeClientRect('.zp-safe-area-inset-bottom').then(res => { - this.cssSafeAreaInsetBottom = res ? res[0].height : -1; - res && success && success(); - }); - } - } -} +// [z-paging]通用布局相关模块 + +// #ifdef APP-NVUE +const weexDom = weex.requireModule('dom'); +// #endif + +export default { + data() { + return { + systemInfo: null, + cssSafeAreaInsetBottom: -1, + isReadyDestroy: false, + } + }, + computed: { + // 顶部可用距离 + windowTop() { + if (!this.systemInfo) return 0; + // 暂时修复vue3中隐藏系统导航栏后windowTop获取不正确的问题,具体bug详见https://ask.dcloud.net.cn/question/141634 + // 感谢litangyu!!https://github.com/SmileZXLee/uni-z-paging/issues/25 + // #ifdef VUE3 && H5 + const pageHeadNode = document.getElementsByTagName("uni-page-head"); + if (!pageHeadNode.length) return 0; + // #endif + return this.systemInfo.windowTop || 0; + }, + // 底部安全区域高度 + safeAreaBottom() { + if (!this.systemInfo) return 0; + let safeAreaBottom = 0; + // #ifdef APP-PLUS + safeAreaBottom = this.systemInfo.safeAreaInsets.bottom || 0 ; + // #endif + // #ifndef APP-PLUS + safeAreaBottom = Math.max(this.cssSafeAreaInsetBottom, 0); + // #endif + return safeAreaBottom; + }, + // 是否是比较老的webview,在一些老的webview中,需要进行一些特殊处理 + isOldWebView() { + // #ifndef APP-NVUE || MP-KUAISHOU + try { + const systemInfos = uni.getSystemInfoSync().system.split(' '); + const deviceType = systemInfos[0]; + const version = parseInt(systemInfos[1]); + if ((deviceType === 'iOS' && version <= 10) || (deviceType === 'Android' && version <= 6)) { + return true; + } + } catch(e) { + return false; + } + // #endif + return false; + }, + // 当前组件的$slots,兼容不同平台 + zSlots() { + // #ifdef VUE2 + + // #ifdef MP-ALIPAY + return this.$slots; + // #endif + + return this.$scopedSlots || this.$slots; + // #endif + + return this.$slots; + }, + }, + beforeDestroy() { + this.isReadyDestroy = true; + }, + // #ifdef VUE3 + unmounted() { + this.isReadyDestroy = true; + }, + // #endif + methods: { + // 更新fixed模式下z-paging的布局 + updateFixedLayout() { + this.fixed && this.$nextTick(() => { + this.systemInfo = uni.getSystemInfoSync(); + }) + }, + // 获取节点尺寸 + _getNodeClientRect(select, inDom = true, scrollOffset = false) { + if (this.isReadyDestroy) { + return Promise.resolve(false); + }; + // nvue中获取节点信息 + // #ifdef APP-NVUE + select = select.replace(/[.|#]/g, ''); + const ref = this.$refs[select]; + return new Promise((resolve, reject) => { + if (ref) { + weexDom.getComponentRect(ref, option => { + resolve(option && option.result ? [option.size] : false); + }) + } else { + resolve(false); + } + }); + return; + // #endif + + // vue中获取节点信息 + //#ifdef MP-ALIPAY + inDom = false; + //#endif + let res = !!inDom ? uni.createSelectorQuery().in(inDom === true ? this : inDom) : uni.createSelectorQuery(); + scrollOffset ? res.select(select).scrollOffset() : res.select(select).boundingClientRect(); + return new Promise((resolve, reject) => { + res.exec(data => { + resolve((data && data != '' && data != undefined && data.length) ? data : false); + }); + }); + }, + // 获取slot="left"和slot="right"宽度并且更新布局 + _updateLeftAndRightWidth(targetStyle, parentNodePrefix) { + this.$nextTick(() => { + let delayTime = 0; + // #ifdef MP-BAIDU + delayTime = 10; + // #endif + setTimeout(() => { + ['left','right'].map(position => { + this._getNodeClientRect(`.${parentNodePrefix}-${position}`).then(res => { + this.$set(targetStyle, position, res ? res[0].width + 'px' : '0px'); + }); + }) + }, delayTime) + }) + }, + // 通过获取css设置的底部安全区域占位view高度设置bottom距离(直接通过systemInfo在部分平台上无法获取到底部安全区域) + _getCssSafeAreaInsetBottom(success) { + this._getNodeClientRect('.zp-safe-area-inset-bottom').then(res => { + this.cssSafeAreaInsetBottom = res ? res[0].height : -1; + res && success && success(); + }); + } + } +} diff --git a/uni_modules/z-paging/components/z-paging/js/modules/data-handle.js b/uni_modules/z-paging/components/z-paging/js/modules/data-handle.js index 249cb81a..42531eb9 100644 --- a/uni_modules/z-paging/components/z-paging/js/modules/data-handle.js +++ b/uni_modules/z-paging/components/z-paging/js/modules/data-handle.js @@ -1,738 +1,738 @@ -// [z-paging]数据处理模块 -import u from '.././z-paging-utils' -import c from '.././z-paging-constant' -import Enum from '.././z-paging-enum' -import interceptor from '../z-paging-interceptor' - -export default { - props: { - // 自定义初始的pageNo,默认为1 - defaultPageNo: { - type: [Number, String], - default: u.gc('defaultPageNo', 1), - observer: function(newVal) { - this.pageNo = newVal; - }, - }, - // 自定义pageSize,默认为10 - defaultPageSize: { - type: [Number, String], - default: u.gc('defaultPageSize', 10), - validator: (value) => { - if (value <= 0) u.consoleErr('default-page-size必须大于0!'); - return value > 0; - } - }, - // 为保证数据一致,设置当前tab切换时的标识key,并在complete中传递相同key,若二者不一致,则complete将不会生效 - dataKey: { - type: [Number, String, Object], - default: u.gc('dataKey', null), - }, - // 使用缓存,若开启将自动缓存第一页的数据,默认为否。请注意,因考虑到切换tab时不同tab数据不同的情况,默认仅会缓存组件首次加载时第一次请求到的数据,后续的下拉刷新操作不会更新缓存。 - useCache: { - type: Boolean, - default: u.gc('useCache', false) - }, - // 使用缓存时缓存的key,用于区分不同列表的缓存数据,useCache为true时必须设置,否则缓存无效 - cacheKey: { - type: String, - default: u.gc('cacheKey', null) - }, - // 缓存模式,默认仅会缓存组件首次加载时第一次请求到的数据,可设置为always,即代表总是缓存,每次列表刷新(下拉刷新、调用reload等)都会更新缓存 - cacheMode: { - type: String, - default: u.gc('cacheMode', Enum.CacheMode.Default) - }, - // 自动注入的list名,可自动修改父view(包含ref="paging")中对应name的list值 - autowireListName: { - type: String, - default: u.gc('autowireListName', '') - }, - // 自动注入的query名,可自动调用父view(包含ref="paging")中的query方法 - autowireQueryName: { - type: String, - default: u.gc('autowireQueryName', '') - }, - // 获取分页数据Function,功能与@query类似。若设置了fetch则@query将不再触发 - fetch: { - type: Function, - default: null - }, - // fetch的附加参数,fetch配置后有效 - fetchParams: { - type: Object, - default: u.gc('fetchParams', null) - }, - // z-paging mounted后自动调用reload方法(mounted后自动调用接口),默认为是 - auto: { - type: Boolean, - default: u.gc('auto', true) - }, - // 用户下拉刷新时是否触发reload方法,默认为是 - reloadWhenRefresh: { - type: Boolean, - default: u.gc('reloadWhenRefresh', true) - }, - // reload时自动滚动到顶部,默认为是 - autoScrollToTopWhenReload: { - type: Boolean, - default: u.gc('autoScrollToTopWhenReload', true) - }, - // reload时立即自动清空原list,默认为是,若立即自动清空,则在reload之后、请求回调之前页面是空白的 - autoCleanListWhenReload: { - type: Boolean, - default: u.gc('autoCleanListWhenReload', true) - }, - // 列表刷新时自动显示下拉刷新view,默认为否 - showRefresherWhenReload: { - type: Boolean, - default: u.gc('showRefresherWhenReload', false) - }, - // 列表刷新时自动显示加载更多view,且为加载中状态,默认为否 - showLoadingMoreWhenReload: { - type: Boolean, - default: u.gc('showLoadingMoreWhenReload', false) - }, - // 组件created时立即触发reload(可解决一些情况下先看到页面再看到loading的问题),auto为true时有效。为否时将在mounted+nextTick后触发reload,默认为否 - createdReload: { - type: Boolean, - default: u.gc('createdReload', false) - }, - // 本地分页时上拉加载更多延迟时间,单位为毫秒,默认200毫秒 - localPagingLoadingTime: { - type: [Number, String], - default: u.gc('localPagingLoadingTime', 200) - }, - // 自动拼接complete中传过来的数组(使用聊天记录模式时无效) - concat: { - type: Boolean, - default: u.gc('concat', true) - }, - // 请求失败是否触发reject,默认为是 - callNetworkReject: { - type: Boolean, - default: u.gc('callNetworkReject', true) - }, - // 父组件v-model所绑定的list的值 - value: { - type: Array, - default: function() { - return []; - } - }, - // #ifdef VUE3 - modelValue: { - type: Array, - default: function() { - return []; - } - } - // #endif - }, - data (){ - return { - currentData: [], - totalData: [], - realTotalData: [], - totalLocalPagingList: [], - dataPromiseResultMap: { - reload: null, - complete: null, - localPaging: null - }, - isSettingCacheList: false, - pageNo: 1, - currentRefreshPageSize: 0, - isLocalPaging: false, - isAddedData: false, - isTotalChangeFromAddData: false, - privateConcat: true, - myParentQuery: -1, - firstPageLoaded: false, - pagingLoaded: false, - loaded: false, - isUserReload: true, - fromEmptyViewReload: false, - queryFrom: '', - listRendering: false, - isHandlingRefreshToPage: false, - isFirstPageAndNoMore: false, - totalDataChangeThrow: true - } - }, - computed: { - pageSize() { - return this.defaultPageSize; - }, - finalConcat() { - return this.concat && this.privateConcat; - }, - finalUseCache() { - if (this.useCache && !this.cacheKey) { - u.consoleErr('use-cache为true时,必须设置cache-key,否则缓存无效!'); - } - return this.useCache && !!this.cacheKey; - }, - finalCacheKey() { - return this.cacheKey ? `${c.cachePrefixKey}-${this.cacheKey}` : null; - }, - isFirstPage() { - return this.pageNo === this.defaultPageNo; - } - }, - watch: { - totalData(newVal, oldVal) { - this._totalDataChange(newVal, oldVal, this.totalDataChangeThrow); - this.totalDataChangeThrow = true; - }, - currentData(newVal, oldVal) { - this._currentDataChange(newVal, oldVal); - }, - useChatRecordMode(newVal, oldVal) { - if (newVal) { - this.nLoadingMoreFixedHeight = false; - } - }, - value: { - handler(newVal) { - // 当v-model绑定的数据源被更改时,此时数据源改变不emit input事件,避免循环调用 - if (newVal !== this.totalData) { - this.totalDataChangeThrow = false; - this.totalData = newVal; - } - }, - immediate: true - }, - // #ifdef VUE3 - modelValue: { - handler(newVal) { - // 当v-model绑定的数据源被更改时,此时数据源改变不emit input事件,避免循环调用 - if (newVal !== this.totalData) { - this.totalDataChangeThrow = false; - this.totalData = newVal; - } - }, - immediate: true - } - // #endif - }, - methods: { - // 请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging处理,第一个参数为请求结果数组,第二个参数为是否成功(默认为是) - complete(data, success = true) { - this.customNoMore = -1; - return this.addData(data, success); - }, - //【保证数据一致】请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging处理,第一个参数为请求结果数组,第二个参数为dataKey,需与:data-key绑定的一致,第三个参数为是否成功(默认为是) - completeByKey(data, dataKey = null, success = true) { - if (dataKey !== null && this.dataKey !== null && dataKey !== this.dataKey) { - this.isFirstPage && this.endRefresh(); - return new Promise(resolve => resolve()); - } - this.customNoMore = -1; - return this.addData(data, success); - }, - //【通过total判断是否有更多数据】请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging处理,第一个参数为请求结果数组,第二个参数为total(列表总数),第三个参数为是否成功(默认为是) - completeByTotal(data, total, success = true) { - if (total == 'undefined') { - this.customNoMore = -1; - } else { - const dataTypeRes = this._checkDataType(data, success, false); - data = dataTypeRes.data; - success = dataTypeRes.success; - if (total >= 0 && success) { - return new Promise((resolve, reject) => { - this.$nextTick(() => { - let nomore = false; - const realTotalDataCount = this.pageNo == this.defaultPageNo ? 0 : this.realTotalData.length; - const dataLength = this.privateConcat ? data.length : 0; - let exceedCount = realTotalDataCount + dataLength - total; - // 没有更多数据了 - if (exceedCount >= 0) { - nomore = true; - // 仅截取total内部分的数据 - exceedCount = this.defaultPageSize - exceedCount; - if (this.privateConcat && exceedCount > 0 && exceedCount < data.length) { - data = data.splice(0, exceedCount); - } - } - this.completeByNoMore(data, nomore, success).then(res => resolve(res)).catch(() => reject()); - }) - }); - } - } - return this.addData(data, success); - }, - //【自行判断是否有更多数据】请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging处理,第一个参数为请求结果数组,第二个参数为是否没有更多数据,第三个参数为是否成功(默认是是) - completeByNoMore(data, nomore, success = true) { - if (nomore != 'undefined') { - this.customNoMore = nomore == true ? 1 : 0; - } - return this.addData(data, success); - }, - // 请求结束且请求失败时调用,支持传入请求失败原因 - completeByError(errorMsg) { - this.customerEmptyViewErrorText = errorMsg; - return this.complete(false); - }, - // 与上方complete方法功能一致,新版本中设置服务端回调数组请使用complete方法 - addData(data, success = true) { - if (!this.fromCompleteEmit) { - this.disabledCompleteEmit = true; - this.fromCompleteEmit = false; - } - const currentTimeStamp = u.getTime(); - const disTime = currentTimeStamp - this.requestTimeStamp; - let minDelay = this.minDelay; - if (this.isFirstPage && this.finalShowRefresherWhenReload) { - minDelay = Math.max(400, minDelay); - } - const addDataDalay = (this.requestTimeStamp > 0 && disTime < minDelay) ? minDelay - disTime : 0; - this.$nextTick(() => { - u.delay(() => { - this._addData(data, success, false); - }, this.delay > 0 ? this.delay : addDataDalay) - }) - - return new Promise((resolve, reject) => { - this.dataPromiseResultMap.complete = { resolve, reject }; - }); - }, - // 从顶部添加数据,不会影响分页的pageNo和pageSize - addDataFromTop(data, toTop = true, toTopWithAnimate = true) { - // 数据是否拼接到顶部,如果是聊天记录模式并且列表没有倒置,则应该拼接在底部 - let addFromTop = !this.isChatRecordModeAndNotInversion; - data = Object.prototype.toString.call(data) !== '[object Array]' ? [data] : (addFromTop ? data.reverse() : data); - // #ifndef APP-NVUE - this.finalUseVirtualList && this._setCellIndex(data, 'top') - // #endif - - this.totalData = addFromTop ? [...data, ...this.totalData] : [...this.totalData, ...data]; - if (toTop) { - u.delay(() => this.useChatRecordMode ? this.scrollToBottom(toTopWithAnimate) : this.scrollToTop(toTopWithAnimate)); - } - }, - // 重新设置列表数据,调用此方法不会影响pageNo和pageSize,也不会触发请求。适用场景:当需要删除列表中某一项时,将删除对应项后的数组通过此方法传递给z-paging。(当出现类似的需要修改列表数组的场景时,请使用此方法,请勿直接修改page中:list.sync绑定的数组) - resetTotalData(data) { - this.isTotalChangeFromAddData = true; - data = Object.prototype.toString.call(data) !== '[object Array]' ? [data] : data; - this.totalData = data; - }, - // 设置本地分页数据,请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging作分页处理(若调用了此方法,则上拉加载更多时内部会自动分页,不会触发@query所绑定的事件) - setLocalPaging(data, success = true) { - this.isLocalPaging = true; - this.$nextTick(() => { - this._addData(data, success, true); - }) - return new Promise((resolve, reject) => { - this.dataPromiseResultMap.localPaging = { resolve, reject }; - }); - }, - // 重新加载分页数据,pageNo会恢复为默认值,相当于下拉刷新的效果(animate为true时会展示下拉刷新动画,默认为false) - reload(animate = this.showRefresherWhenReload) { - if (animate) { - this.privateShowRefresherWhenReload = animate; - this.isUserPullDown = true; - } - if (!this.showLoadingMoreWhenReload) { - this.listRendering = true; - } - this.$nextTick(() => { - this._preReload(animate, false); - }) - return new Promise((resolve, reject) => { - this.dataPromiseResultMap.reload = { resolve, reject }; - }); - }, - // 刷新列表数据,pageNo和pageSize不会重置,列表数据会重新从服务端获取。必须保证@query绑定的方法中的pageNo和pageSize和传给服务端的一致 - refresh() { - return this._handleRefreshWithDisPageNo(this.pageNo - this.defaultPageNo + 1); - }, - // 刷新列表数据至指定页,例如pageNo=5时则代表刷新列表至第5页,此时pageNo会变为5,列表会展示前5页的数据。必须保证@query绑定的方法中的pageNo和pageSize和传给服务端的一致 - refreshToPage(pageNo) { - this.isHandlingRefreshToPage = true; - return this._handleRefreshWithDisPageNo(pageNo + this.defaultPageNo - 1); - }, - // 手动更新列表缓存数据,将自动截取v-model绑定的list中的前pageSize条覆盖缓存,请确保在list数据更新到预期结果后再调用此方法 - updateCache() { - if (this.finalUseCache && this.totalData.length) { - this._saveLocalCache(this.totalData.slice(0, Math.min(this.totalData.length, this.pageSize))); - } - }, - // 清空分页数据 - clean() { - this._reload(true); - this._addData([], true, false); - }, - // 清空分页数据 - clear() { - this.clean(); - }, - // reload之前的一些处理 - _preReload(animate = this.showRefresherWhenReload, isFromMounted = true, retryCount = 0) { - const showRefresher = this.finalRefresherEnabled && this.useCustomRefresher; - // #ifndef APP-NVUE - // 如果获取slot="refresher"高度失败,则不触发reload,直到获取slot="refresher"高度成功 - if (this.customRefresherHeight === -1 && showRefresher) { - u.delay(() => { - retryCount ++; - // 如果重试次数是10的倍数(也就是每500毫秒),尝试重新获取一下slot="refresher"高度 - // 此举是为了解决在某些特殊情况下,z-paging组件mounted了,但是未展示在用户面前,(比如在tabbar页面中,未切换到对应tabbar但是通过代码让z-paging展示了,此时控制台会报Error: Not Found:Page,因为这时候去获取dom节点信息获取不到) - // 当用户在某个时刻让此z-paging展示在面前时,即可顺利获取到slot="refresher"高度,递归停止 - if (retryCount % 10 === 0) { - this._updateCustomRefresherHeight(); - } - this._preReload(animate, isFromMounted, retryCount); - }, c.delayTime / 2); - return; - } - // #endif - this.isUserReload = true; - this.loadingType = Enum.LoadingType.Refresher; - if (animate) { - this.privateShowRefresherWhenReload = animate; - // #ifndef APP-NVUE - if (this.useCustomRefresher) { - this._doRefresherRefreshAnimate(); - } else { - this.refresherTriggered = true; - } - // #endif - // #ifdef APP-NVUE - this.refresherStatus = Enum.Refresher.Loading; - this.refresherRevealStackCount ++; - u.delay(() => { - this._getNodeClientRect('zp-n-refresh-container', false).then((node) => { - if (node) { - let nodeHeight = node[0].height; - this.nShowRefresherReveal = true; - this.nShowRefresherRevealHeight = nodeHeight; - u.delay(() => { - this._nDoRefresherEndAnimation(0, -nodeHeight, false, false); - u.delay(() => { - this._nDoRefresherEndAnimation(nodeHeight, 0); - }, 10) - }, 10) - } - this._reload(false, isFromMounted); - this._doRefresherLoad(false); - }); - }, this.pagingLoaded ? 10 : 100) - return; - // #endif - } else { - this._refresherEnd(false, false, false, false); - } - this._reload(false, isFromMounted); - }, - // 重新加载分页数据 - _reload(isClean = false, isFromMounted = false, isUserPullDown = false) { - this.isAddedData = false; - this.insideOfPaging = -1; - this.cacheScrollNodeHeight = -1; - this.pageNo = this.defaultPageNo; - this._cleanRefresherEndTimeout(); - !this.privateShowRefresherWhenReload && !isClean && this._startLoading(true); - this.firstPageLoaded = true; - this.isTotalChangeFromAddData = false; - if (!this.isSettingCacheList) { - this.totalData = []; - } - if (!isClean) { - this._emitQuery(this.pageNo, this.defaultPageSize, isUserPullDown ? Enum.QueryFrom.UserPullDown : Enum.QueryFrom.Reload); - let delay = 0; - // #ifdef MP-TOUTIAO - delay = 5; - // #endif - u.delay(this._callMyParentQuery, delay); - if (!isFromMounted && this.autoScrollToTopWhenReload) { - let checkedNRefresherLoading = true; - // #ifdef APP-NVUE - checkedNRefresherLoading = !this.nRefresherLoading; - // #endif - checkedNRefresherLoading && this._scrollToTop(false); - } - } - // #ifdef APP-NVUE - this.$nextTick(() => { - this.nShowBottom = this.realTotalData.length > 0; - }) - // #endif - }, - // 处理服务端返回的数组 - _addData(data, success, isLocal) { - this.isAddedData = true; - this.fromEmptyViewReload = false; - this.isTotalChangeFromAddData = true; - this.refresherTriggered = false; - this._endSystemLoadingAndRefresh(); - const tempIsUserPullDown = this.isUserPullDown; - if (this.showRefresherUpdateTime && this.isFirstPage) { - u.setRefesrherTime(u.getTime(), this.refresherUpdateTimeKey); - this.$refs.refresh && this.$refs.refresh.updateTime(); - } - if (!isLocal && tempIsUserPullDown && this.isFirstPage) { - this.isUserPullDown = false; - } - if (!this.isFirstPage) { - this.listRendering = true; - this.$nextTick(() => { - u.delay(() => this.listRendering = false); - }) - } else { - this.listRendering = false; - } - let dataTypeRes = this._checkDataType(data, success, isLocal); - data = dataTypeRes.data; - success = dataTypeRes.success; - let delayTime = c.delayTime; - if (this.useChatRecordMode) delayTime = 0; - this.loadingForNow = false; - u.delay(() => { - this.pagingLoaded = true; - this.$nextTick(()=>{ - !isLocal && this._refresherEnd(delayTime > 0, true, tempIsUserPullDown); - }) - }) - if (this.isFirstPage) { - this.isLoadFailed = !success; - this.$emit('isLoadFailedChange', this.isLoadFailed); - if (this.finalUseCache && success && (this.cacheMode === Enum.CacheMode.Always ? true : this.isSettingCacheList)) { - this._saveLocalCache(data); - } - } - this.isSettingCacheList = false; - if (success) { - if (!(this.privateConcat === false && !this.isHandlingRefreshToPage && this.loadingStatus === Enum.More.NoMore)) { - this.loadingStatus = Enum.More.Default; - } - if (isLocal) { - // 如果当前是本地分页,则必然是由setLocalPaging方法触发,此时直接本地加载第一页数据即可。后续本地分页加载更多方法由滚动到底部加载更多事件处理 - this.totalLocalPagingList = data; - const localPageNo = this.defaultPageNo; - const localPageSize = this.queryFrom !== Enum.QueryFrom.Refresh ? this.defaultPageSize : this.currentRefreshPageSize; - this._localPagingQueryList(localPageNo, localPageSize, 0, res => { - this.completeByTotal(res, this.totalLocalPagingList.length); - }) - } else { - // 如果当前不是本地分页,则按照正常分页逻辑进行数据处理&emit数据 - let dataChangeDelayTime = 0; - // #ifdef APP-NVUE - if (this.privateShowRefresherWhenReload && this.finalNvueListIs === 'waterfall') { - dataChangeDelayTime = 150; - } - // #endif - u.delay(() => { - this._currentDataChange(data, this.currentData); - this._callDataPromise(true, this.totalData); - }, dataChangeDelayTime) - } - if (this.isHandlingRefreshToPage) { - this.isHandlingRefreshToPage = false; - this.pageNo = this.defaultPageNo + Math.ceil(data.length / this.pageSize) - 1; - if (data.length % this.pageSize !== 0) { - this.customNoMore = 1; - } - } - } else { - this._currentDataChange(data, this.currentData); - this._callDataPromise(false); - this.loadingStatus = Enum.More.Fail; - this.isHandlingRefreshToPage = false; - if (this.loadingType === Enum.LoadingType.LoadingMore) { - this.pageNo --; - } - } - }, - // 所有数据改变时调用 - _totalDataChange(newVal, oldVal, eventThrow=true) { - if ((!this.isUserReload || !this.autoCleanListWhenReload) && this.firstPageLoaded && !newVal.length && oldVal.length) { - return; - } - this._doCheckScrollViewShouldFullHeight(newVal); - if(!this.realTotalData.length && !newVal.length){ - eventThrow = false; - } - this.realTotalData = newVal; - // emit列表更新事件 - if (eventThrow) { - this.$emit('input', newVal); - // #ifdef VUE3 - this.$emit('update:modelValue', newVal); - // #endif - this.$emit('update:list', newVal); - this.$emit('listChange', newVal); - this._callMyParentList(newVal); - } - this.firstPageLoaded = false; - this.isTotalChangeFromAddData = false; - this.$nextTick(() => { - u.delay(()=>{ - // emit z-paging内容区域高度改变事件 - this._getNodeClientRect('.zp-paging-container-content').then(res => { - res && this.$emit('contentHeightChanged', res[0].height); - }); - }, c.delayTime * (this.isIos ? 1 : 3)) - // #ifdef APP-NVUE - // 在nvue中延时600毫秒展示底部加载更多,避免底部加载更多太早加载闪一下的问题 - u.delay(() => { - this.nShowBottom = true; - }, c.delayTime * 6, 'nShowBottomDelay'); - // #endif - }) - }, - // 当前数据改变时调用 - _currentDataChange(newVal, oldVal) { - newVal = [...newVal]; - // #ifndef APP-NVUE - this.finalUseVirtualList && this._setCellIndex(newVal, 'bottom'); - // #endif - if (this.isFirstPage && this.finalConcat) { - this.totalData = []; - } - // customNoMore:-1代表交由z-paging自行判断;1代表没有更多了;0代表还有更多数据 - if (this.customNoMore !== -1) { - // 如果customNoMore等于1 或者 customNoMore不是0并且新增数组长度为0(也就是不是明确的还有更多数据并且新增的数组长度为0),则没有更多数据了 - if (this.customNoMore === 1 || (this.customNoMore !== 0 && !newVal.length)) { - this.loadingStatus = Enum.More.NoMore; - } - } else { - // 如果新增的数据数组长度为0 或者 新增的数组长度小于默认的pageSize,则没有更多数据了 - if (!newVal.length || (newVal.length && newVal.length < this.defaultPageSize)) { - this.loadingStatus = Enum.More.NoMore; - } - } - if (!this.totalData.length) { - // #ifdef APP-NVUE - // 如果在聊天记录模式+nvue中,并且数据不满一页时需要将列表倒序,因为此时没有将列表旋转180度,数组中第0条数据应当在最底下显示 - if (this.useChatRecordMode && this.finalConcat && this.isFirstPage && this.loadingStatus === Enum.More.NoMore) { - newVal.reverse(); - } - // #endif - this.totalData = newVal; - } else { - if (this.finalConcat) { - const currentScrollTop = this.oldScrollTop; - this.totalData = [...this.totalData, ...newVal]; - // 此处是为了解决在微信小程序中,在某些情况下滚动到底部加载更多后滚动位置直接变为最底部的问题,因此需要通过代码强制滚动回加载更多前的位置 - // #ifdef MP-WEIXIN - if (!this.isIos && !this.refresherOnly && !this.usePageScroll && newVal.length) { - this.loadingMoreTimeStamp = u.getTime(); - this.$nextTick(() => { - this.scrollToY(currentScrollTop); - }) - } - // #endif - } else { - this.totalData = newVal; - } - } - this.privateConcat = true; - }, - // 根据pageNo处理refresh操作 - _handleRefreshWithDisPageNo(pageNo) { - if (!this.isHandlingRefreshToPage && !this.realTotalData.length) return this.reload(); - if (pageNo >= 1) { - this.loading = true; - this.privateConcat = false; - const totalPageSize = pageNo * this.pageSize; - this.currentRefreshPageSize = totalPageSize; - // 如果调用refresh时是本地分页,则在组件内部自己处理分页逻辑,不emit query相关事件 - if (this.isLocalPaging && this.isHandlingRefreshToPage) { - this._localPagingQueryList(this.defaultPageNo, totalPageSize, 0, res => { - this.complete(res); - }) - } else { - // emit query相关事件 - this._emitQuery(this.defaultPageNo, totalPageSize, Enum.QueryFrom.Refresh); - this._callMyParentQuery(this.defaultPageNo, totalPageSize); - } - } - return new Promise((resolve, reject) => { - this.dataPromiseResultMap.reload = { resolve, reject }; - }); - }, - // 本地分页请求 - _localPagingQueryList(pageNo, pageSize, localPagingLoadingTime, callback) { - pageNo = Math.max(1, pageNo); - pageSize = Math.max(1, pageSize); - const totalPagingList = [...this.totalLocalPagingList]; - const pageNoIndex = (pageNo - 1) * pageSize; - const finalPageNoIndex = Math.min(totalPagingList.length, pageNoIndex + pageSize); - const resultPagingList = totalPagingList.splice(pageNoIndex, finalPageNoIndex - pageNoIndex); - u.delay(() => callback(resultPagingList), localPagingLoadingTime) - }, - // 存储列表缓存数据 - _saveLocalCache(data) { - uni.setStorageSync(this.finalCacheKey, data); - }, - // 通过缓存数据填充列表数据 - _setListByLocalCache() { - this.totalData = uni.getStorageSync(this.finalCacheKey) || []; - this.isSettingCacheList = true; - }, - // 修改父view的list - _callMyParentList(newVal) { - if (this.autowireListName.length) { - const myParent = u.getParent(this.$parent); - if (myParent && myParent[this.autowireListName]) { - myParent[this.autowireListName] = newVal; - } - } - }, - // 调用父view的query - _callMyParentQuery(customPageNo = 0, customPageSize = 0) { - if (this.autowireQueryName) { - if (this.myParentQuery === -1) { - const myParent = u.getParent(this.$parent); - if (myParent && myParent[this.autowireQueryName]) { - this.myParentQuery = myParent[this.autowireQueryName]; - } - } - if (this.myParentQuery !== -1) { - customPageSize > 0 ? this.myParentQuery(customPageNo, customPageSize) : this.myParentQuery(this.pageNo, this.defaultPageSize); - } - } - }, - // emit query事件 - _emitQuery(pageNo, pageSize, from){ - this.queryFrom = from; - this.requestTimeStamp = u.getTime(); - const [lastItem] = this.realTotalData.slice(-1); - if (this.fetch) { - const fetchParams = interceptor._handleFetchParams({pageNo, pageSize, from, lastItem: lastItem || null}, this.fetchParams); - const fetchResult = this.fetch(fetchParams); - if (!interceptor._handleFetchResult(fetchResult, this, fetchParams)) { - u.isPromise(fetchResult) ? fetchResult.then(res => { - this.complete(res); - }).catch(err => { - this.complete(false); - }) : this.complete(fetchResult) - } - } else { - this.$emit('query', ...interceptor._handleQuery(pageNo, pageSize, from, lastItem || null)); - } - }, - // 触发数据改变promise - _callDataPromise(success, totalList) { - for (const key in this.dataPromiseResultMap) { - const obj = this.dataPromiseResultMap[key]; - if (!obj) continue; - success ? obj.resolve({ totalList, noMore: this.loadingStatus === Enum.More.NoMore }) : this.callNetworkReject && obj.reject(`z-paging-${key}-error`); - } - }, - // 检查complete data的类型 - _checkDataType(data, success, isLocal) { - const dataType = Object.prototype.toString.call(data); - if (dataType === '[object Boolean]') { - success = data; - data = []; - } else if (dataType !== '[object Array]') { - data = []; - if (dataType !== '[object Undefined]' && dataType !== '[object Null]') { - u.consoleErr(`${isLocal ? 'setLocalPaging' : 'complete'}参数类型不正确,第一个参数类型必须为Array!`); - } - } - return { data, success }; - }, - } -} +// [z-paging]数据处理模块 +import u from '.././z-paging-utils' +import c from '.././z-paging-constant' +import Enum from '.././z-paging-enum' +import interceptor from '../z-paging-interceptor' + +export default { + props: { + // 自定义初始的pageNo,默认为1 + defaultPageNo: { + type: [Number, String], + default: u.gc('defaultPageNo', 1), + observer: function(newVal) { + this.pageNo = newVal; + }, + }, + // 自定义pageSize,默认为10 + defaultPageSize: { + type: [Number, String], + default: u.gc('defaultPageSize', 10), + validator: (value) => { + if (value <= 0) u.consoleErr('default-page-size必须大于0!'); + return value > 0; + } + }, + // 为保证数据一致,设置当前tab切换时的标识key,并在complete中传递相同key,若二者不一致,则complete将不会生效 + dataKey: { + type: [Number, String, Object], + default: u.gc('dataKey', null), + }, + // 使用缓存,若开启将自动缓存第一页的数据,默认为否。请注意,因考虑到切换tab时不同tab数据不同的情况,默认仅会缓存组件首次加载时第一次请求到的数据,后续的下拉刷新操作不会更新缓存。 + useCache: { + type: Boolean, + default: u.gc('useCache', false) + }, + // 使用缓存时缓存的key,用于区分不同列表的缓存数据,useCache为true时必须设置,否则缓存无效 + cacheKey: { + type: String, + default: u.gc('cacheKey', null) + }, + // 缓存模式,默认仅会缓存组件首次加载时第一次请求到的数据,可设置为always,即代表总是缓存,每次列表刷新(下拉刷新、调用reload等)都会更新缓存 + cacheMode: { + type: String, + default: u.gc('cacheMode', Enum.CacheMode.Default) + }, + // 自动注入的list名,可自动修改父view(包含ref="paging")中对应name的list值 + autowireListName: { + type: String, + default: u.gc('autowireListName', '') + }, + // 自动注入的query名,可自动调用父view(包含ref="paging")中的query方法 + autowireQueryName: { + type: String, + default: u.gc('autowireQueryName', '') + }, + // 获取分页数据Function,功能与@query类似。若设置了fetch则@query将不再触发 + fetch: { + type: Function, + default: null + }, + // fetch的附加参数,fetch配置后有效 + fetchParams: { + type: Object, + default: u.gc('fetchParams', null) + }, + // z-paging mounted后自动调用reload方法(mounted后自动调用接口),默认为是 + auto: { + type: Boolean, + default: u.gc('auto', true) + }, + // 用户下拉刷新时是否触发reload方法,默认为是 + reloadWhenRefresh: { + type: Boolean, + default: u.gc('reloadWhenRefresh', true) + }, + // reload时自动滚动到顶部,默认为是 + autoScrollToTopWhenReload: { + type: Boolean, + default: u.gc('autoScrollToTopWhenReload', true) + }, + // reload时立即自动清空原list,默认为是,若立即自动清空,则在reload之后、请求回调之前页面是空白的 + autoCleanListWhenReload: { + type: Boolean, + default: u.gc('autoCleanListWhenReload', true) + }, + // 列表刷新时自动显示下拉刷新view,默认为否 + showRefresherWhenReload: { + type: Boolean, + default: u.gc('showRefresherWhenReload', false) + }, + // 列表刷新时自动显示加载更多view,且为加载中状态,默认为否 + showLoadingMoreWhenReload: { + type: Boolean, + default: u.gc('showLoadingMoreWhenReload', false) + }, + // 组件created时立即触发reload(可解决一些情况下先看到页面再看到loading的问题),auto为true时有效。为否时将在mounted+nextTick后触发reload,默认为否 + createdReload: { + type: Boolean, + default: u.gc('createdReload', false) + }, + // 本地分页时上拉加载更多延迟时间,单位为毫秒,默认200毫秒 + localPagingLoadingTime: { + type: [Number, String], + default: u.gc('localPagingLoadingTime', 200) + }, + // 自动拼接complete中传过来的数组(使用聊天记录模式时无效) + concat: { + type: Boolean, + default: u.gc('concat', true) + }, + // 请求失败是否触发reject,默认为是 + callNetworkReject: { + type: Boolean, + default: u.gc('callNetworkReject', true) + }, + // 父组件v-model所绑定的list的值 + value: { + type: Array, + default: function() { + return []; + } + }, + // #ifdef VUE3 + modelValue: { + type: Array, + default: function() { + return []; + } + } + // #endif + }, + data (){ + return { + currentData: [], + totalData: [], + realTotalData: [], + totalLocalPagingList: [], + dataPromiseResultMap: { + reload: null, + complete: null, + localPaging: null + }, + isSettingCacheList: false, + pageNo: 1, + currentRefreshPageSize: 0, + isLocalPaging: false, + isAddedData: false, + isTotalChangeFromAddData: false, + privateConcat: true, + myParentQuery: -1, + firstPageLoaded: false, + pagingLoaded: false, + loaded: false, + isUserReload: true, + fromEmptyViewReload: false, + queryFrom: '', + listRendering: false, + isHandlingRefreshToPage: false, + isFirstPageAndNoMore: false, + totalDataChangeThrow: true + } + }, + computed: { + pageSize() { + return this.defaultPageSize; + }, + finalConcat() { + return this.concat && this.privateConcat; + }, + finalUseCache() { + if (this.useCache && !this.cacheKey) { + u.consoleErr('use-cache为true时,必须设置cache-key,否则缓存无效!'); + } + return this.useCache && !!this.cacheKey; + }, + finalCacheKey() { + return this.cacheKey ? `${c.cachePrefixKey}-${this.cacheKey}` : null; + }, + isFirstPage() { + return this.pageNo === this.defaultPageNo; + } + }, + watch: { + totalData(newVal, oldVal) { + this._totalDataChange(newVal, oldVal, this.totalDataChangeThrow); + this.totalDataChangeThrow = true; + }, + currentData(newVal, oldVal) { + this._currentDataChange(newVal, oldVal); + }, + useChatRecordMode(newVal, oldVal) { + if (newVal) { + this.nLoadingMoreFixedHeight = false; + } + }, + value: { + handler(newVal) { + // 当v-model绑定的数据源被更改时,此时数据源改变不emit input事件,避免循环调用 + if (newVal !== this.totalData) { + this.totalDataChangeThrow = false; + this.totalData = newVal; + } + }, + immediate: true + }, + // #ifdef VUE3 + modelValue: { + handler(newVal) { + // 当v-model绑定的数据源被更改时,此时数据源改变不emit input事件,避免循环调用 + if (newVal !== this.totalData) { + this.totalDataChangeThrow = false; + this.totalData = newVal; + } + }, + immediate: true + } + // #endif + }, + methods: { + // 请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging处理,第一个参数为请求结果数组,第二个参数为是否成功(默认为是) + complete(data, success = true) { + this.customNoMore = -1; + return this.addData(data, success); + }, + //【保证数据一致】请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging处理,第一个参数为请求结果数组,第二个参数为dataKey,需与:data-key绑定的一致,第三个参数为是否成功(默认为是) + completeByKey(data, dataKey = null, success = true) { + if (dataKey !== null && this.dataKey !== null && dataKey !== this.dataKey) { + this.isFirstPage && this.endRefresh(); + return new Promise(resolve => resolve()); + } + this.customNoMore = -1; + return this.addData(data, success); + }, + //【通过total判断是否有更多数据】请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging处理,第一个参数为请求结果数组,第二个参数为total(列表总数),第三个参数为是否成功(默认为是) + completeByTotal(data, total, success = true) { + if (total == 'undefined') { + this.customNoMore = -1; + } else { + const dataTypeRes = this._checkDataType(data, success, false); + data = dataTypeRes.data; + success = dataTypeRes.success; + if (total >= 0 && success) { + return new Promise((resolve, reject) => { + this.$nextTick(() => { + let nomore = false; + const realTotalDataCount = this.pageNo == this.defaultPageNo ? 0 : this.realTotalData.length; + const dataLength = this.privateConcat ? data.length : 0; + let exceedCount = realTotalDataCount + dataLength - total; + // 没有更多数据了 + if (exceedCount >= 0) { + nomore = true; + // 仅截取total内部分的数据 + exceedCount = this.defaultPageSize - exceedCount; + if (this.privateConcat && exceedCount > 0 && exceedCount < data.length) { + data = data.splice(0, exceedCount); + } + } + this.completeByNoMore(data, nomore, success).then(res => resolve(res)).catch(() => reject()); + }) + }); + } + } + return this.addData(data, success); + }, + //【自行判断是否有更多数据】请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging处理,第一个参数为请求结果数组,第二个参数为是否没有更多数据,第三个参数为是否成功(默认是是) + completeByNoMore(data, nomore, success = true) { + if (nomore != 'undefined') { + this.customNoMore = nomore == true ? 1 : 0; + } + return this.addData(data, success); + }, + // 请求结束且请求失败时调用,支持传入请求失败原因 + completeByError(errorMsg) { + this.customerEmptyViewErrorText = errorMsg; + return this.complete(false); + }, + // 与上方complete方法功能一致,新版本中设置服务端回调数组请使用complete方法 + addData(data, success = true) { + if (!this.fromCompleteEmit) { + this.disabledCompleteEmit = true; + this.fromCompleteEmit = false; + } + const currentTimeStamp = u.getTime(); + const disTime = currentTimeStamp - this.requestTimeStamp; + let minDelay = this.minDelay; + if (this.isFirstPage && this.finalShowRefresherWhenReload) { + minDelay = Math.max(400, minDelay); + } + const addDataDalay = (this.requestTimeStamp > 0 && disTime < minDelay) ? minDelay - disTime : 0; + this.$nextTick(() => { + u.delay(() => { + this._addData(data, success, false); + }, this.delay > 0 ? this.delay : addDataDalay) + }) + + return new Promise((resolve, reject) => { + this.dataPromiseResultMap.complete = { resolve, reject }; + }); + }, + // 从顶部添加数据,不会影响分页的pageNo和pageSize + addDataFromTop(data, toTop = true, toTopWithAnimate = true) { + // 数据是否拼接到顶部,如果是聊天记录模式并且列表没有倒置,则应该拼接在底部 + let addFromTop = !this.isChatRecordModeAndNotInversion; + data = Object.prototype.toString.call(data) !== '[object Array]' ? [data] : (addFromTop ? data.reverse() : data); + // #ifndef APP-NVUE + this.finalUseVirtualList && this._setCellIndex(data, 'top') + // #endif + + this.totalData = addFromTop ? [...data, ...this.totalData] : [...this.totalData, ...data]; + if (toTop) { + u.delay(() => this.useChatRecordMode ? this.scrollToBottom(toTopWithAnimate) : this.scrollToTop(toTopWithAnimate)); + } + }, + // 重新设置列表数据,调用此方法不会影响pageNo和pageSize,也不会触发请求。适用场景:当需要删除列表中某一项时,将删除对应项后的数组通过此方法传递给z-paging。(当出现类似的需要修改列表数组的场景时,请使用此方法,请勿直接修改page中:list.sync绑定的数组) + resetTotalData(data) { + this.isTotalChangeFromAddData = true; + data = Object.prototype.toString.call(data) !== '[object Array]' ? [data] : data; + this.totalData = data; + }, + // 设置本地分页数据,请求结束(成功或者失败)调用此方法,将请求的结果传递给z-paging作分页处理(若调用了此方法,则上拉加载更多时内部会自动分页,不会触发@query所绑定的事件) + setLocalPaging(data, success = true) { + this.isLocalPaging = true; + this.$nextTick(() => { + this._addData(data, success, true); + }) + return new Promise((resolve, reject) => { + this.dataPromiseResultMap.localPaging = { resolve, reject }; + }); + }, + // 重新加载分页数据,pageNo会恢复为默认值,相当于下拉刷新的效果(animate为true时会展示下拉刷新动画,默认为false) + reload(animate = this.showRefresherWhenReload) { + if (animate) { + this.privateShowRefresherWhenReload = animate; + this.isUserPullDown = true; + } + if (!this.showLoadingMoreWhenReload) { + this.listRendering = true; + } + this.$nextTick(() => { + this._preReload(animate, false); + }) + return new Promise((resolve, reject) => { + this.dataPromiseResultMap.reload = { resolve, reject }; + }); + }, + // 刷新列表数据,pageNo和pageSize不会重置,列表数据会重新从服务端获取。必须保证@query绑定的方法中的pageNo和pageSize和传给服务端的一致 + refresh() { + return this._handleRefreshWithDisPageNo(this.pageNo - this.defaultPageNo + 1); + }, + // 刷新列表数据至指定页,例如pageNo=5时则代表刷新列表至第5页,此时pageNo会变为5,列表会展示前5页的数据。必须保证@query绑定的方法中的pageNo和pageSize和传给服务端的一致 + refreshToPage(pageNo) { + this.isHandlingRefreshToPage = true; + return this._handleRefreshWithDisPageNo(pageNo + this.defaultPageNo - 1); + }, + // 手动更新列表缓存数据,将自动截取v-model绑定的list中的前pageSize条覆盖缓存,请确保在list数据更新到预期结果后再调用此方法 + updateCache() { + if (this.finalUseCache && this.totalData.length) { + this._saveLocalCache(this.totalData.slice(0, Math.min(this.totalData.length, this.pageSize))); + } + }, + // 清空分页数据 + clean() { + this._reload(true); + this._addData([], true, false); + }, + // 清空分页数据 + clear() { + this.clean(); + }, + // reload之前的一些处理 + _preReload(animate = this.showRefresherWhenReload, isFromMounted = true, retryCount = 0) { + const showRefresher = this.finalRefresherEnabled && this.useCustomRefresher; + // #ifndef APP-NVUE + // 如果获取slot="refresher"高度失败,则不触发reload,直到获取slot="refresher"高度成功 + if (this.customRefresherHeight === -1 && showRefresher) { + u.delay(() => { + retryCount ++; + // 如果重试次数是10的倍数(也就是每500毫秒),尝试重新获取一下slot="refresher"高度 + // 此举是为了解决在某些特殊情况下,z-paging组件mounted了,但是未展示在用户面前,(比如在tabbar页面中,未切换到对应tabbar但是通过代码让z-paging展示了,此时控制台会报Error: Not Found:Page,因为这时候去获取dom节点信息获取不到) + // 当用户在某个时刻让此z-paging展示在面前时,即可顺利获取到slot="refresher"高度,递归停止 + if (retryCount % 10 === 0) { + this._updateCustomRefresherHeight(); + } + this._preReload(animate, isFromMounted, retryCount); + }, c.delayTime / 2); + return; + } + // #endif + this.isUserReload = true; + this.loadingType = Enum.LoadingType.Refresher; + if (animate) { + this.privateShowRefresherWhenReload = animate; + // #ifndef APP-NVUE + if (this.useCustomRefresher) { + this._doRefresherRefreshAnimate(); + } else { + this.refresherTriggered = true; + } + // #endif + // #ifdef APP-NVUE + this.refresherStatus = Enum.Refresher.Loading; + this.refresherRevealStackCount ++; + u.delay(() => { + this._getNodeClientRect('zp-n-refresh-container', false).then((node) => { + if (node) { + let nodeHeight = node[0].height; + this.nShowRefresherReveal = true; + this.nShowRefresherRevealHeight = nodeHeight; + u.delay(() => { + this._nDoRefresherEndAnimation(0, -nodeHeight, false, false); + u.delay(() => { + this._nDoRefresherEndAnimation(nodeHeight, 0); + }, 10) + }, 10) + } + this._reload(false, isFromMounted); + this._doRefresherLoad(false); + }); + }, this.pagingLoaded ? 10 : 100) + return; + // #endif + } else { + this._refresherEnd(false, false, false, false); + } + this._reload(false, isFromMounted); + }, + // 重新加载分页数据 + _reload(isClean = false, isFromMounted = false, isUserPullDown = false) { + this.isAddedData = false; + this.insideOfPaging = -1; + this.cacheScrollNodeHeight = -1; + this.pageNo = this.defaultPageNo; + this._cleanRefresherEndTimeout(); + !this.privateShowRefresherWhenReload && !isClean && this._startLoading(true); + this.firstPageLoaded = true; + this.isTotalChangeFromAddData = false; + if (!this.isSettingCacheList) { + this.totalData = []; + } + if (!isClean) { + this._emitQuery(this.pageNo, this.defaultPageSize, isUserPullDown ? Enum.QueryFrom.UserPullDown : Enum.QueryFrom.Reload); + let delay = 0; + // #ifdef MP-TOUTIAO + delay = 5; + // #endif + u.delay(this._callMyParentQuery, delay); + if (!isFromMounted && this.autoScrollToTopWhenReload) { + let checkedNRefresherLoading = true; + // #ifdef APP-NVUE + checkedNRefresherLoading = !this.nRefresherLoading; + // #endif + checkedNRefresherLoading && this._scrollToTop(false); + } + } + // #ifdef APP-NVUE + this.$nextTick(() => { + this.nShowBottom = this.realTotalData.length > 0; + }) + // #endif + }, + // 处理服务端返回的数组 + _addData(data, success, isLocal) { + this.isAddedData = true; + this.fromEmptyViewReload = false; + this.isTotalChangeFromAddData = true; + this.refresherTriggered = false; + this._endSystemLoadingAndRefresh(); + const tempIsUserPullDown = this.isUserPullDown; + if (this.showRefresherUpdateTime && this.isFirstPage) { + u.setRefesrherTime(u.getTime(), this.refresherUpdateTimeKey); + this.$refs.refresh && this.$refs.refresh.updateTime(); + } + if (!isLocal && tempIsUserPullDown && this.isFirstPage) { + this.isUserPullDown = false; + } + if (!this.isFirstPage) { + this.listRendering = true; + this.$nextTick(() => { + u.delay(() => this.listRendering = false); + }) + } else { + this.listRendering = false; + } + let dataTypeRes = this._checkDataType(data, success, isLocal); + data = dataTypeRes.data; + success = dataTypeRes.success; + let delayTime = c.delayTime; + if (this.useChatRecordMode) delayTime = 0; + this.loadingForNow = false; + u.delay(() => { + this.pagingLoaded = true; + this.$nextTick(()=>{ + !isLocal && this._refresherEnd(delayTime > 0, true, tempIsUserPullDown); + }) + }) + if (this.isFirstPage) { + this.isLoadFailed = !success; + this.$emit('isLoadFailedChange', this.isLoadFailed); + if (this.finalUseCache && success && (this.cacheMode === Enum.CacheMode.Always ? true : this.isSettingCacheList)) { + this._saveLocalCache(data); + } + } + this.isSettingCacheList = false; + if (success) { + if (!(this.privateConcat === false && !this.isHandlingRefreshToPage && this.loadingStatus === Enum.More.NoMore)) { + this.loadingStatus = Enum.More.Default; + } + if (isLocal) { + // 如果当前是本地分页,则必然是由setLocalPaging方法触发,此时直接本地加载第一页数据即可。后续本地分页加载更多方法由滚动到底部加载更多事件处理 + this.totalLocalPagingList = data; + const localPageNo = this.defaultPageNo; + const localPageSize = this.queryFrom !== Enum.QueryFrom.Refresh ? this.defaultPageSize : this.currentRefreshPageSize; + this._localPagingQueryList(localPageNo, localPageSize, 0, res => { + this.completeByTotal(res, this.totalLocalPagingList.length); + }) + } else { + // 如果当前不是本地分页,则按照正常分页逻辑进行数据处理&emit数据 + let dataChangeDelayTime = 0; + // #ifdef APP-NVUE + if (this.privateShowRefresherWhenReload && this.finalNvueListIs === 'waterfall') { + dataChangeDelayTime = 150; + } + // #endif + u.delay(() => { + this._currentDataChange(data, this.currentData); + this._callDataPromise(true, this.totalData); + }, dataChangeDelayTime) + } + if (this.isHandlingRefreshToPage) { + this.isHandlingRefreshToPage = false; + this.pageNo = this.defaultPageNo + Math.ceil(data.length / this.pageSize) - 1; + if (data.length % this.pageSize !== 0) { + this.customNoMore = 1; + } + } + } else { + this._currentDataChange(data, this.currentData); + this._callDataPromise(false); + this.loadingStatus = Enum.More.Fail; + this.isHandlingRefreshToPage = false; + if (this.loadingType === Enum.LoadingType.LoadingMore) { + this.pageNo --; + } + } + }, + // 所有数据改变时调用 + _totalDataChange(newVal, oldVal, eventThrow=true) { + if ((!this.isUserReload || !this.autoCleanListWhenReload) && this.firstPageLoaded && !newVal.length && oldVal.length) { + return; + } + this._doCheckScrollViewShouldFullHeight(newVal); + if(!this.realTotalData.length && !newVal.length){ + eventThrow = false; + } + this.realTotalData = newVal; + // emit列表更新事件 + if (eventThrow) { + this.$emit('input', newVal); + // #ifdef VUE3 + this.$emit('update:modelValue', newVal); + // #endif + this.$emit('update:list', newVal); + this.$emit('listChange', newVal); + this._callMyParentList(newVal); + } + this.firstPageLoaded = false; + this.isTotalChangeFromAddData = false; + this.$nextTick(() => { + u.delay(()=>{ + // emit z-paging内容区域高度改变事件 + this._getNodeClientRect('.zp-paging-container-content').then(res => { + res && this.$emit('contentHeightChanged', res[0].height); + }); + }, c.delayTime * (this.isIos ? 1 : 3)) + // #ifdef APP-NVUE + // 在nvue中延时600毫秒展示底部加载更多,避免底部加载更多太早加载闪一下的问题 + u.delay(() => { + this.nShowBottom = true; + }, c.delayTime * 6, 'nShowBottomDelay'); + // #endif + }) + }, + // 当前数据改变时调用 + _currentDataChange(newVal, oldVal) { + newVal = [...newVal]; + // #ifndef APP-NVUE + this.finalUseVirtualList && this._setCellIndex(newVal, 'bottom'); + // #endif + if (this.isFirstPage && this.finalConcat) { + this.totalData = []; + } + // customNoMore:-1代表交由z-paging自行判断;1代表没有更多了;0代表还有更多数据 + if (this.customNoMore !== -1) { + // 如果customNoMore等于1 或者 customNoMore不是0并且新增数组长度为0(也就是不是明确的还有更多数据并且新增的数组长度为0),则没有更多数据了 + if (this.customNoMore === 1 || (this.customNoMore !== 0 && !newVal.length)) { + this.loadingStatus = Enum.More.NoMore; + } + } else { + // 如果新增的数据数组长度为0 或者 新增的数组长度小于默认的pageSize,则没有更多数据了 + if (!newVal.length || (newVal.length && newVal.length < this.defaultPageSize)) { + this.loadingStatus = Enum.More.NoMore; + } + } + if (!this.totalData.length) { + // #ifdef APP-NVUE + // 如果在聊天记录模式+nvue中,并且数据不满一页时需要将列表倒序,因为此时没有将列表旋转180度,数组中第0条数据应当在最底下显示 + if (this.useChatRecordMode && this.finalConcat && this.isFirstPage && this.loadingStatus === Enum.More.NoMore) { + newVal.reverse(); + } + // #endif + this.totalData = newVal; + } else { + if (this.finalConcat) { + const currentScrollTop = this.oldScrollTop; + this.totalData = [...this.totalData, ...newVal]; + // 此处是为了解决在微信小程序中,在某些情况下滚动到底部加载更多后滚动位置直接变为最底部的问题,因此需要通过代码强制滚动回加载更多前的位置 + // #ifdef MP-WEIXIN + if (!this.isIos && !this.refresherOnly && !this.usePageScroll && newVal.length) { + this.loadingMoreTimeStamp = u.getTime(); + this.$nextTick(() => { + this.scrollToY(currentScrollTop); + }) + } + // #endif + } else { + this.totalData = newVal; + } + } + this.privateConcat = true; + }, + // 根据pageNo处理refresh操作 + _handleRefreshWithDisPageNo(pageNo) { + if (!this.isHandlingRefreshToPage && !this.realTotalData.length) return this.reload(); + if (pageNo >= 1) { + this.loading = true; + this.privateConcat = false; + const totalPageSize = pageNo * this.pageSize; + this.currentRefreshPageSize = totalPageSize; + // 如果调用refresh时是本地分页,则在组件内部自己处理分页逻辑,不emit query相关事件 + if (this.isLocalPaging && this.isHandlingRefreshToPage) { + this._localPagingQueryList(this.defaultPageNo, totalPageSize, 0, res => { + this.complete(res); + }) + } else { + // emit query相关事件 + this._emitQuery(this.defaultPageNo, totalPageSize, Enum.QueryFrom.Refresh); + this._callMyParentQuery(this.defaultPageNo, totalPageSize); + } + } + return new Promise((resolve, reject) => { + this.dataPromiseResultMap.reload = { resolve, reject }; + }); + }, + // 本地分页请求 + _localPagingQueryList(pageNo, pageSize, localPagingLoadingTime, callback) { + pageNo = Math.max(1, pageNo); + pageSize = Math.max(1, pageSize); + const totalPagingList = [...this.totalLocalPagingList]; + const pageNoIndex = (pageNo - 1) * pageSize; + const finalPageNoIndex = Math.min(totalPagingList.length, pageNoIndex + pageSize); + const resultPagingList = totalPagingList.splice(pageNoIndex, finalPageNoIndex - pageNoIndex); + u.delay(() => callback(resultPagingList), localPagingLoadingTime) + }, + // 存储列表缓存数据 + _saveLocalCache(data) { + uni.setStorageSync(this.finalCacheKey, data); + }, + // 通过缓存数据填充列表数据 + _setListByLocalCache() { + this.totalData = uni.getStorageSync(this.finalCacheKey) || []; + this.isSettingCacheList = true; + }, + // 修改父view的list + _callMyParentList(newVal) { + if (this.autowireListName.length) { + const myParent = u.getParent(this.$parent); + if (myParent && myParent[this.autowireListName]) { + myParent[this.autowireListName] = newVal; + } + } + }, + // 调用父view的query + _callMyParentQuery(customPageNo = 0, customPageSize = 0) { + if (this.autowireQueryName) { + if (this.myParentQuery === -1) { + const myParent = u.getParent(this.$parent); + if (myParent && myParent[this.autowireQueryName]) { + this.myParentQuery = myParent[this.autowireQueryName]; + } + } + if (this.myParentQuery !== -1) { + customPageSize > 0 ? this.myParentQuery(customPageNo, customPageSize) : this.myParentQuery(this.pageNo, this.defaultPageSize); + } + } + }, + // emit query事件 + _emitQuery(pageNo, pageSize, from){ + this.queryFrom = from; + this.requestTimeStamp = u.getTime(); + const [lastItem] = this.realTotalData.slice(-1); + if (this.fetch) { + const fetchParams = interceptor._handleFetchParams({pageNo, pageSize, from, lastItem: lastItem || null}, this.fetchParams); + const fetchResult = this.fetch(fetchParams); + if (!interceptor._handleFetchResult(fetchResult, this, fetchParams)) { + u.isPromise(fetchResult) ? fetchResult.then(res => { + this.complete(res); + }).catch(err => { + this.complete(false); + }) : this.complete(fetchResult) + } + } else { + this.$emit('query', ...interceptor._handleQuery(pageNo, pageSize, from, lastItem || null)); + } + }, + // 触发数据改变promise + _callDataPromise(success, totalList) { + for (const key in this.dataPromiseResultMap) { + const obj = this.dataPromiseResultMap[key]; + if (!obj) continue; + success ? obj.resolve({ totalList, noMore: this.loadingStatus === Enum.More.NoMore }) : this.callNetworkReject && obj.reject(`z-paging-${key}-error`); + } + }, + // 检查complete data的类型 + _checkDataType(data, success, isLocal) { + const dataType = Object.prototype.toString.call(data); + if (dataType === '[object Boolean]') { + success = data; + data = []; + } else if (dataType !== '[object Array]') { + data = []; + if (dataType !== '[object Undefined]' && dataType !== '[object Null]') { + u.consoleErr(`${isLocal ? 'setLocalPaging' : 'complete'}参数类型不正确,第一个参数类型必须为Array!`); + } + } + return { data, success }; + }, + } +} diff --git a/uni_modules/z-paging/components/z-paging/js/modules/empty.js b/uni_modules/z-paging/components/z-paging/js/modules/empty.js index 6c99f560..09b045c8 100644 --- a/uni_modules/z-paging/components/z-paging/js/modules/empty.js +++ b/uni_modules/z-paging/components/z-paging/js/modules/empty.js @@ -1,144 +1,144 @@ -// [z-paging]空数据图view模块 -import u from '.././z-paging-utils' - -export default { - props: { - // 是否强制隐藏空数据图,默认为否 - hideEmptyView: { - type: Boolean, - default: u.gc('hideEmptyView', false) - }, - // 空数据图描述文字,默认为“没有数据哦~” - emptyViewText: { - type: [String, Object], - default: u.gc('emptyViewText', null) - }, - // 是否显示空数据图重新加载按钮(无数据时),默认为否 - showEmptyViewReload: { - type: Boolean, - default: u.gc('showEmptyViewReload', false) - }, - // 加载失败时是否显示空数据图重新加载按钮,默认为是 - showEmptyViewReloadWhenError: { - type: Boolean, - default: u.gc('showEmptyViewReloadWhenError', true) - }, - // 空数据图点击重新加载文字,默认为“重新加载” - emptyViewReloadText: { - type: [String, Object], - default: u.gc('emptyViewReloadText', null) - }, - // 空数据图图片,默认使用z-paging内置的图片 - emptyViewImg: { - type: String, - default: u.gc('emptyViewImg', '') - }, - // 空数据图“加载失败”描述文字,默认为“很抱歉,加载失败” - emptyViewErrorText: { - type: [String, Object], - default: u.gc('emptyViewErrorText', null) - }, - // 空数据图“加载失败”图片,默认使用z-paging内置的图片 - emptyViewErrorImg: { - type: String, - default: u.gc('emptyViewErrorImg', '') - }, - // 空数据图样式 - emptyViewStyle: { - type: Object, - default: u.gc('emptyViewStyle', {}) - }, - // 空数据图容器样式 - emptyViewSuperStyle: { - type: Object, - default: u.gc('emptyViewSuperStyle', {}) - }, - // 空数据图img样式 - emptyViewImgStyle: { - type: Object, - default: u.gc('emptyViewImgStyle', {}) - }, - // 空数据图描述文字样式 - emptyViewTitleStyle: { - type: Object, - default: u.gc('emptyViewTitleStyle', {}) - }, - // 空数据图重新加载按钮样式 - emptyViewReloadStyle: { - type: Object, - default: u.gc('emptyViewReloadStyle', {}) - }, - // 空数据图片是否铺满z-paging,默认为否,即填充满z-paging内列表(滚动区域)部分。若设置为否,则为填铺满整个z-paging - emptyViewFixed: { - type: Boolean, - default: u.gc('emptyViewFixed', false) - }, - // 空数据图片是否垂直居中,默认为是,若设置为否即为从空数据容器顶部开始显示。emptyViewFixed为false时有效 - emptyViewCenter: { - type: Boolean, - default: u.gc('emptyViewCenter', true) - }, - // 加载中时是否自动隐藏空数据图,默认为是 - autoHideEmptyViewWhenLoading: { - type: Boolean, - default: u.gc('autoHideEmptyViewWhenLoading', true) - }, - // 用户下拉列表触发下拉刷新加载中时是否自动隐藏空数据图,默认为是 - autoHideEmptyViewWhenPull: { - type: Boolean, - default: u.gc('autoHideEmptyViewWhenPull', true) - }, - // 空数据view的z-index,默认为9 - emptyViewZIndex: { - type: Number, - default: u.gc('emptyViewZIndex', 9) - }, - }, - data() { - return { - customerEmptyViewErrorText: '' - } - }, - computed: { - finalEmptyViewImg() { - return this.isLoadFailed ? this.emptyViewErrorImg : this.emptyViewImg; - }, - finalShowEmptyViewReload() { - return this.isLoadFailed ? this.showEmptyViewReloadWhenError : this.showEmptyViewReload; - }, - // 是否展示空数据图 - showEmpty() { - if (this.refresherOnly || this.hideEmptyView || this.realTotalData.length) return false; - if (this.autoHideEmptyViewWhenLoading) { - if (this.isAddedData && !this.firstPageLoaded && !this.loading) return true; - } else { - return true; - } - return !this.autoHideEmptyViewWhenPull && !this.isUserReload; - }, - }, - methods: { - // 点击了空数据view重新加载按钮 - _emptyViewReload() { - let callbacked = false; - this.$emit('emptyViewReload', reload => { - if (reload === undefined || reload === true) { - this.fromEmptyViewReload = true; - this.reload().catch(() => {}); - } - callbacked = true; - }); - // 如果用户没有禁止默认的点击重新加载刷新列表事件,则触发列表重新刷新 - this.$nextTick(() => { - if (!callbacked) { - this.fromEmptyViewReload = true; - this.reload().catch(() => {}); - } - }) - }, - // 点击了空数据view - _emptyViewClick() { - this.$emit('emptyViewClick'); - }, - } +// [z-paging]空数据图view模块 +import u from '.././z-paging-utils' + +export default { + props: { + // 是否强制隐藏空数据图,默认为否 + hideEmptyView: { + type: Boolean, + default: u.gc('hideEmptyView', false) + }, + // 空数据图描述文字,默认为“没有数据哦~” + emptyViewText: { + type: [String, Object], + default: u.gc('emptyViewText', null) + }, + // 是否显示空数据图重新加载按钮(无数据时),默认为否 + showEmptyViewReload: { + type: Boolean, + default: u.gc('showEmptyViewReload', false) + }, + // 加载失败时是否显示空数据图重新加载按钮,默认为是 + showEmptyViewReloadWhenError: { + type: Boolean, + default: u.gc('showEmptyViewReloadWhenError', true) + }, + // 空数据图点击重新加载文字,默认为“重新加载” + emptyViewReloadText: { + type: [String, Object], + default: u.gc('emptyViewReloadText', null) + }, + // 空数据图图片,默认使用z-paging内置的图片 + emptyViewImg: { + type: String, + default: u.gc('emptyViewImg', '') + }, + // 空数据图“加载失败”描述文字,默认为“很抱歉,加载失败” + emptyViewErrorText: { + type: [String, Object], + default: u.gc('emptyViewErrorText', null) + }, + // 空数据图“加载失败”图片,默认使用z-paging内置的图片 + emptyViewErrorImg: { + type: String, + default: u.gc('emptyViewErrorImg', '') + }, + // 空数据图样式 + emptyViewStyle: { + type: Object, + default: u.gc('emptyViewStyle', {}) + }, + // 空数据图容器样式 + emptyViewSuperStyle: { + type: Object, + default: u.gc('emptyViewSuperStyle', {}) + }, + // 空数据图img样式 + emptyViewImgStyle: { + type: Object, + default: u.gc('emptyViewImgStyle', {}) + }, + // 空数据图描述文字样式 + emptyViewTitleStyle: { + type: Object, + default: u.gc('emptyViewTitleStyle', {}) + }, + // 空数据图重新加载按钮样式 + emptyViewReloadStyle: { + type: Object, + default: u.gc('emptyViewReloadStyle', {}) + }, + // 空数据图片是否铺满z-paging,默认为否,即填充满z-paging内列表(滚动区域)部分。若设置为否,则为填铺满整个z-paging + emptyViewFixed: { + type: Boolean, + default: u.gc('emptyViewFixed', false) + }, + // 空数据图片是否垂直居中,默认为是,若设置为否即为从空数据容器顶部开始显示。emptyViewFixed为false时有效 + emptyViewCenter: { + type: Boolean, + default: u.gc('emptyViewCenter', true) + }, + // 加载中时是否自动隐藏空数据图,默认为是 + autoHideEmptyViewWhenLoading: { + type: Boolean, + default: u.gc('autoHideEmptyViewWhenLoading', true) + }, + // 用户下拉列表触发下拉刷新加载中时是否自动隐藏空数据图,默认为是 + autoHideEmptyViewWhenPull: { + type: Boolean, + default: u.gc('autoHideEmptyViewWhenPull', true) + }, + // 空数据view的z-index,默认为9 + emptyViewZIndex: { + type: Number, + default: u.gc('emptyViewZIndex', 9) + }, + }, + data() { + return { + customerEmptyViewErrorText: '' + } + }, + computed: { + finalEmptyViewImg() { + return this.isLoadFailed ? this.emptyViewErrorImg : this.emptyViewImg; + }, + finalShowEmptyViewReload() { + return this.isLoadFailed ? this.showEmptyViewReloadWhenError : this.showEmptyViewReload; + }, + // 是否展示空数据图 + showEmpty() { + if (this.refresherOnly || this.hideEmptyView || this.realTotalData.length) return false; + if (this.autoHideEmptyViewWhenLoading) { + if (this.isAddedData && !this.firstPageLoaded && !this.loading) return true; + } else { + return true; + } + return !this.autoHideEmptyViewWhenPull && !this.isUserReload; + }, + }, + methods: { + // 点击了空数据view重新加载按钮 + _emptyViewReload() { + let callbacked = false; + this.$emit('emptyViewReload', reload => { + if (reload === undefined || reload === true) { + this.fromEmptyViewReload = true; + this.reload().catch(() => {}); + } + callbacked = true; + }); + // 如果用户没有禁止默认的点击重新加载刷新列表事件,则触发列表重新刷新 + this.$nextTick(() => { + if (!callbacked) { + this.fromEmptyViewReload = true; + this.reload().catch(() => {}); + } + }) + }, + // 点击了空数据view + _emptyViewClick() { + this.$emit('emptyViewClick'); + }, + } } \ No newline at end of file diff --git a/uni_modules/z-paging/components/z-paging/js/modules/i18n.js b/uni_modules/z-paging/components/z-paging/js/modules/i18n.js index b521c8e3..909d7dbc 100644 --- a/uni_modules/z-paging/components/z-paging/js/modules/i18n.js +++ b/uni_modules/z-paging/components/z-paging/js/modules/i18n.js @@ -1,119 +1,119 @@ -// [z-paging]i18n模块 -import { initVueI18n } from '@dcloudio/uni-i18n' -import messages from '../../i18n/index.js' -const { t } = initVueI18n(messages) - -import u from '.././z-paging-utils' -import c from '.././z-paging-constant' -import interceptor from '../z-paging-interceptor' - -const language = uni.getSystemInfoSync().language; -export default { - data() { - return { - language - } - }, - computed: { - finalLanguage() { - try { - const local = uni.getLocale(); - const language = this.language; - return local === 'auto' ? interceptor._handleLanguage2Local(language, this._language2Local(language)) : local; - } catch (e) { - // 如果获取系统本地语言异常,则默认返回中文,uni.getLocale在部分低版本HX或者cli中可能报找不到的问题 - return 'zh-Hans'; - } - }, - // 最终的下拉刷新默认状态的文字 - finalRefresherDefaultText() { - return this._getI18nText('zp.refresher.default', this.refresherDefaultText); - }, - // 最终的下拉刷新下拉中的文字 - finalRefresherPullingText() { - return this._getI18nText('zp.refresher.pulling', this.refresherPullingText); - }, - // 最终的下拉刷新中文字 - finalRefresherRefreshingText() { - return this._getI18nText('zp.refresher.refreshing', this.refresherRefreshingText); - }, - // 最终的下拉刷新完成文字 - finalRefresherCompleteText() { - return this._getI18nText('zp.refresher.complete', this.refresherCompleteText); - }, - // 最终的下拉刷新上次更新时间文字 - finalRefresherUpdateTimeTextMap() { - return { - title: t('zp.refresherUpdateTime.title'), - none: t('zp.refresherUpdateTime.none'), - today: t('zp.refresherUpdateTime.today'), - yesterday: t('zp.refresherUpdateTime.yesterday') - }; - }, - // 最终的继续下拉进入二楼文字 - finalRefresherGoF2Text() { - return this._getI18nText('zp.refresher.f2', this.refresherGoF2Text); - }, - // 最终的底部加载更多默认状态文字 - finalLoadingMoreDefaultText() { - return this._getI18nText('zp.loadingMore.default', this.loadingMoreDefaultText); - }, - // 最终的底部加载更多加载中文字 - finalLoadingMoreLoadingText() { - return this._getI18nText('zp.loadingMore.loading', this.loadingMoreLoadingText); - }, - // 最终的底部加载更多没有更多数据文字 - finalLoadingMoreNoMoreText() { - return this._getI18nText('zp.loadingMore.noMore', this.loadingMoreNoMoreText); - }, - // 最终的底部加载更多加载失败文字 - finalLoadingMoreFailText() { - return this._getI18nText('zp.loadingMore.fail', this.loadingMoreFailText); - }, - // 最终的空数据图title - finalEmptyViewText() { - return this.isLoadFailed ? this.finalEmptyViewErrorText : this._getI18nText('zp.emptyView.title', this.emptyViewText); - }, - // 最终的空数据图reload title - finalEmptyViewReloadText() { - return this._getI18nText('zp.emptyView.reload', this.emptyViewReloadText); - }, - // 最终的空数据图加载失败文字 - finalEmptyViewErrorText() { - return this.customerEmptyViewErrorText || this._getI18nText('zp.emptyView.error', this.emptyViewErrorText); - }, - // 最终的系统loading title - finalSystemLoadingText() { - return this._getI18nText('zp.systemLoading.title', this.systemLoadingText); - }, - }, - methods: { - // 获取当前z-paging的语言 - getLanguage() { - return this.finalLanguage; - }, - // 获取国际化转换后的文本 - _getI18nText(key, value) { - const dataType = Object.prototype.toString.call(value); - if (dataType === '[object Object]') { - const nextValue = value[this.finalLanguage]; - if (nextValue) return nextValue; - } else if (dataType === '[object String]') { - return value; - } - return t(key); - }, - // 系统language转i18n local - _language2Local(language) { - const formatedLanguage = language.toLowerCase().replace(new RegExp('_', ''), '-'); - if (formatedLanguage.indexOf('zh') !== -1) { - if (formatedLanguage === 'zh' || formatedLanguage === 'zh-cn' || formatedLanguage.indexOf('zh-hans') !== -1) { - return 'zh-Hans'; - } - return 'zh-Hant'; - } - if (formatedLanguage.indexOf('en') !== -1) return 'en'; - return language; - } - } -} +// [z-paging]i18n模块 +import { initVueI18n } from '@dcloudio/uni-i18n' +import messages from '../../i18n/index.js' +const { t } = initVueI18n(messages) + +import u from '.././z-paging-utils' +import c from '.././z-paging-constant' +import interceptor from '../z-paging-interceptor' + +const language = uni.getSystemInfoSync().language; +export default { + data() { + return { + language + } + }, + computed: { + finalLanguage() { + try { + const local = uni.getLocale(); + const language = this.language; + return local === 'auto' ? interceptor._handleLanguage2Local(language, this._language2Local(language)) : local; + } catch (e) { + // 如果获取系统本地语言异常,则默认返回中文,uni.getLocale在部分低版本HX或者cli中可能报找不到的问题 + return 'zh-Hans'; + } + }, + // 最终的下拉刷新默认状态的文字 + finalRefresherDefaultText() { + return this._getI18nText('zp.refresher.default', this.refresherDefaultText); + }, + // 最终的下拉刷新下拉中的文字 + finalRefresherPullingText() { + return this._getI18nText('zp.refresher.pulling', this.refresherPullingText); + }, + // 最终的下拉刷新中文字 + finalRefresherRefreshingText() { + return this._getI18nText('zp.refresher.refreshing', this.refresherRefreshingText); + }, + // 最终的下拉刷新完成文字 + finalRefresherCompleteText() { + return this._getI18nText('zp.refresher.complete', this.refresherCompleteText); + }, + // 最终的下拉刷新上次更新时间文字 + finalRefresherUpdateTimeTextMap() { + return { + title: t('zp.refresherUpdateTime.title'), + none: t('zp.refresherUpdateTime.none'), + today: t('zp.refresherUpdateTime.today'), + yesterday: t('zp.refresherUpdateTime.yesterday') + }; + }, + // 最终的继续下拉进入二楼文字 + finalRefresherGoF2Text() { + return this._getI18nText('zp.refresher.f2', this.refresherGoF2Text); + }, + // 最终的底部加载更多默认状态文字 + finalLoadingMoreDefaultText() { + return this._getI18nText('zp.loadingMore.default', this.loadingMoreDefaultText); + }, + // 最终的底部加载更多加载中文字 + finalLoadingMoreLoadingText() { + return this._getI18nText('zp.loadingMore.loading', this.loadingMoreLoadingText); + }, + // 最终的底部加载更多没有更多数据文字 + finalLoadingMoreNoMoreText() { + return this._getI18nText('zp.loadingMore.noMore', this.loadingMoreNoMoreText); + }, + // 最终的底部加载更多加载失败文字 + finalLoadingMoreFailText() { + return this._getI18nText('zp.loadingMore.fail', this.loadingMoreFailText); + }, + // 最终的空数据图title + finalEmptyViewText() { + return this.isLoadFailed ? this.finalEmptyViewErrorText : this._getI18nText('zp.emptyView.title', this.emptyViewText); + }, + // 最终的空数据图reload title + finalEmptyViewReloadText() { + return this._getI18nText('zp.emptyView.reload', this.emptyViewReloadText); + }, + // 最终的空数据图加载失败文字 + finalEmptyViewErrorText() { + return this.customerEmptyViewErrorText || this._getI18nText('zp.emptyView.error', this.emptyViewErrorText); + }, + // 最终的系统loading title + finalSystemLoadingText() { + return this._getI18nText('zp.systemLoading.title', this.systemLoadingText); + }, + }, + methods: { + // 获取当前z-paging的语言 + getLanguage() { + return this.finalLanguage; + }, + // 获取国际化转换后的文本 + _getI18nText(key, value) { + const dataType = Object.prototype.toString.call(value); + if (dataType === '[object Object]') { + const nextValue = value[this.finalLanguage]; + if (nextValue) return nextValue; + } else if (dataType === '[object String]') { + return value; + } + return t(key); + }, + // 系统language转i18n local + _language2Local(language) { + const formatedLanguage = language.toLowerCase().replace(new RegExp('_', ''), '-'); + if (formatedLanguage.indexOf('zh') !== -1) { + if (formatedLanguage === 'zh' || formatedLanguage === 'zh-cn' || formatedLanguage.indexOf('zh-hans') !== -1) { + return 'zh-Hans'; + } + return 'zh-Hant'; + } + if (formatedLanguage.indexOf('en') !== -1) return 'en'; + return language; + } + } +} diff --git a/uni_modules/z-paging/components/z-paging/js/modules/load-more.js b/uni_modules/z-paging/components/z-paging/js/modules/load-more.js index 40af1a6e..d7467522 100644 --- a/uni_modules/z-paging/components/z-paging/js/modules/load-more.js +++ b/uni_modules/z-paging/components/z-paging/js/modules/load-more.js @@ -1,370 +1,370 @@ -// [z-paging]滚动到底部加载更多模块 -import u from '.././z-paging-utils' -import Enum from '.././z-paging-enum' - -export default { - props: { - // 自定义底部加载更多样式 - loadingMoreCustomStyle: { - type: Object, - default: u.gc('loadingMoreCustomStyle', {}) - }, - // 自定义底部加载更多文字样式 - loadingMoreTitleCustomStyle: { - type: Object, - default: u.gc('loadingMoreTitleCustomStyle', {}) - }, - // 自定义底部加载更多加载中动画样式 - loadingMoreLoadingIconCustomStyle: { - type: Object, - default: u.gc('loadingMoreLoadingIconCustomStyle', {}) - }, - // 自定义底部加载更多加载中动画图标类型,可选flower或circle,默认为flower - loadingMoreLoadingIconType: { - type: String, - default: u.gc('loadingMoreLoadingIconType', 'flower') - }, - // 自定义底部加载更多加载中动画图标图片 - loadingMoreLoadingIconCustomImage: { - type: String, - default: u.gc('loadingMoreLoadingIconCustomImage', '') - }, - // 底部加载更多加载中view是否展示旋转动画,默认为是 - loadingMoreLoadingAnimated: { - type: Boolean, - default: u.gc('loadingMoreLoadingAnimated', true) - }, - // 是否启用加载更多数据(含滑动到底部加载更多数据和点击加载更多数据),默认为是 - loadingMoreEnabled: { - type: Boolean, - default: u.gc('loadingMoreEnabled', true) - }, - // 是否启用滑动到底部加载更多数据,默认为是 - toBottomLoadingMoreEnabled: { - type: Boolean, - default: u.gc('toBottomLoadingMoreEnabled', true) - }, - // 滑动到底部状态为默认状态时,以加载中的状态展示,默认为否。若设置为是,可避免滚动到底部看到默认状态然后立刻变为加载中状态的问题,但分页数量未超过一屏时,不会显示【点击加载更多】 - loadingMoreDefaultAsLoading: { - type: Boolean, - default: u.gc('loadingMoreDefaultAsLoading', false) - }, - // 滑动到底部"默认"文字,默认为【点击加载更多】 - loadingMoreDefaultText: { - type: [String, Object], - default: u.gc('loadingMoreDefaultText', null) - }, - // 滑动到底部"加载中"文字,默认为【正在加载...】 - loadingMoreLoadingText: { - type: [String, Object], - default: u.gc('loadingMoreLoadingText', null) - }, - // 滑动到底部"没有更多"文字,默认为【没有更多了】 - loadingMoreNoMoreText: { - type: [String, Object], - default: u.gc('loadingMoreNoMoreText', null) - }, - // 滑动到底部"加载失败"文字,默认为【加载失败,点击重新加载】 - loadingMoreFailText: { - type: [String, Object], - default: u.gc('loadingMoreFailText', null) - }, - // 当没有更多数据且分页内容未超出z-paging时是否隐藏没有更多数据的view,默认为否 - hideNoMoreInside: { - type: Boolean, - default: u.gc('hideNoMoreInside', false) - }, - // 当没有更多数据且分页数组长度少于这个值时,隐藏没有更多数据的view,默认为0,代表不限制。 - hideNoMoreByLimit: { - type: Number, - default: u.gc('hideNoMoreByLimit', 0) - }, - // 是否显示默认的加载更多text,默认为是 - showDefaultLoadingMoreText: { - type: Boolean, - default: u.gc('showDefaultLoadingMoreText', true) - }, - // 是否显示没有更多数据的view - showLoadingMoreNoMoreView: { - type: Boolean, - default: u.gc('showLoadingMoreNoMoreView', true) - }, - // 是否显示没有更多数据的分割线,默认为是 - showLoadingMoreNoMoreLine: { - type: Boolean, - default: u.gc('showLoadingMoreNoMoreLine', true) - }, - // 自定义底部没有更多数据的分割线样式 - loadingMoreNoMoreLineCustomStyle: { - type: Object, - default: u.gc('loadingMoreNoMoreLineCustomStyle', {}) - }, - // 当分页未满一屏时,是否自动加载更多,默认为否(nvue无效) - insideMore: { - type: Boolean, - default: u.gc('insideMore', false) - }, - // 距底部/右边多远时(单位px),触发 scrolltolower 事件,默认为100rpx - lowerThreshold: { - type: [Number, String], - default: u.gc('lowerThreshold', '100rpx') - }, - }, - data() { - return { - M: Enum.More, - // 底部加载更多状态 - loadingStatus: Enum.More.Default, - // 在渲染之后的底部加载更多状态 - loadingStatusAfterRender: Enum.More.Default, - // 底部加载更多时间戳 - loadingMoreTimeStamp: 0, - // 底部加载更多slot - loadingMoreDefaultSlot: null, - // 是否展示底部加载更多 - showLoadingMore: false, - // 是否是开发者自定义的加载更多,-1代表交由z-paging自行判断;1代表没有更多了;0代表还有更多数据 - customNoMore: -1, - } - }, - computed: { - // 底部加载更多配置 - zLoadMoreConfig() { - return { - status: this.loadingStatusAfterRender, - defaultAsLoading: this.loadingMoreDefaultAsLoading || (this.useChatRecordMode && this.chatLoadingMoreDefaultAsLoading), - defaultThemeStyle: this.finalLoadingMoreThemeStyle, - customStyle: this.loadingMoreCustomStyle, - titleCustomStyle: this.loadingMoreTitleCustomStyle, - iconCustomStyle: this.loadingMoreLoadingIconCustomStyle, - loadingIconType: this.loadingMoreLoadingIconType, - loadingIconCustomImage: this.loadingMoreLoadingIconCustomImage, - loadingAnimated: this.loadingMoreLoadingAnimated, - showNoMoreLine: this.showLoadingMoreNoMoreLine, - noMoreLineCustomStyle: this.loadingMoreNoMoreLineCustomStyle, - defaultText: this.finalLoadingMoreDefaultText, - loadingText: this.finalLoadingMoreLoadingText, - noMoreText: this.finalLoadingMoreNoMoreText, - failText: this.finalLoadingMoreFailText, - hideContent: !this.loadingMoreDefaultAsLoading && this.listRendering, - unit: this.unit, - isChat: this.useChatRecordMode, - chatDefaultAsLoading: this.chatLoadingMoreDefaultAsLoading - }; - }, - // 最终的底部加载更多主题 - finalLoadingMoreThemeStyle() { - return this.loadingMoreThemeStyle.length ? this.loadingMoreThemeStyle : this.defaultThemeStyle; - }, - // 最终的底部加载更多触发阈值 - finalLowerThreshold() { - return u.convertToPx(this.lowerThreshold); - }, - // 是否显示默认状态下的底部加载更多 - showLoadingMoreDefault() { - return this._showLoadingMore('Default'); - }, - // 是否显示加载中状态下的底部加载更多 - showLoadingMoreLoading() { - return this._showLoadingMore('Loading'); - }, - // 是否显示没有更多了状态下的底部加载更多 - showLoadingMoreNoMore() { - return this._showLoadingMore('NoMore'); - }, - // 是否显示加载失败状态下的底部加载更多 - showLoadingMoreFail() { - return this._showLoadingMore('Fail'); - }, - // 是否显示自定义状态下的底部加载更多 - showLoadingMoreCustom() { - return this._showLoadingMore('Custom'); - } - }, - methods: { - // 页面滚动到底部时通知z-paging进行进一步处理 - pageReachBottom() { - !this.useChatRecordMode && this._onLoadingMore('toBottom'); - }, - // 手动触发上拉加载更多(非必须,可依据具体需求使用) - doLoadMore(type) { - this._onLoadingMore(type); - }, - // 通过@scroll事件检测是否滚动到了底部(顺带检测下是否滚动到了顶部) - _checkScrolledToBottom(scrollDiff, checked = false) { - // 如果当前scroll-view高度未获取,则获取其高度 - if (this.cacheScrollNodeHeight === -1) { - // 获取当前scroll-view高度 - this._getNodeClientRect('.zp-scroll-view').then((res) => { - if (res) { - const scrollNodeHeight = res[0].height; - // 缓存当前scroll-view高度,如果获取过了不再获取 - this.cacheScrollNodeHeight = scrollNodeHeight; - // // scrollDiff - this.cacheScrollNodeHeight = 当前滚动区域的顶部与内容底部的距离 - scroll-view高度 = 当前滚动区域的底部与内容底部的距离(也就是最终的与底部的距离) - if (scrollDiff - scrollNodeHeight <= this.finalLowerThreshold) { - // 如果与底部的距离小于阈值,则判断为滚动到了底部,触发滚动到底部事件 - this._onLoadingMore('toBottom'); - } - } - }); - } else { - // scrollDiff - this.cacheScrollNodeHeight = 当前滚动区域的顶部与内容底部的距离 - scroll-view高度 = 当前滚动区域的底部与内容底部的距离(也就是最终的与底部的距离) - if (scrollDiff - this.cacheScrollNodeHeight <= this.finalLowerThreshold) { - // 如果与底部的距离小于阈值,则判断为滚动到了底部,触发滚动到底部事件 - this._onLoadingMore('toBottom'); - } else if (scrollDiff - this.cacheScrollNodeHeight <= 500 && !checked) { - // 如果与底部的距离小于500px,则获取当前滚动的位置,延迟150毫秒重复上述步骤再次检测(避免@scroll触发时获取的scrollTop不正确导致的其他问题,此时获取的scrollTop不一定可信)。防止因为部分性能较差安卓设备@scroll采样率过低导致的滚动到底部但是依然没有触发的问题 - u.delay(() => { - this._getNodeClientRect('.zp-scroll-view', true, true).then((res) => { - if (res) { - this.oldScrollTop = res[0].scrollTop; - const newScrollDiff = res[0].scrollHeight - this.oldScrollTop; - this._checkScrolledToBottom(newScrollDiff, true); - } - }) - }, 150, 'checkScrolledToBottomDelay') - } - // 检测一下是否已经滚动到了顶部了,因为在安卓中滚动到顶部时scrollTop不一定为0(和滚动到底部一样的原因),所以需要在scrollTop小于150px时,通过获取.zp-scroll-view的scrollTop再判断一下 - if (this.oldScrollTop <= 150 && this.oldScrollTop !== 0) { - u.delay(() => { - // 这里再判断一下是否确实已经滚动到顶部了,如果已经滚动到顶部了,则不用再判断了,再次判断的原因是可能150毫秒之后oldScrollTop才是0 - if (this.oldScrollTop !== 0) { - this._getNodeClientRect('.zp-scroll-view', true, true).then((res) => { - // 如果150毫秒后.zp-scroll-view的scrollTop为0,则认为已经滚动到了顶部了 - if (res && res[0].scrollTop === 0 && this.oldScrollTop !== 0) { - this._onScrollToUpper(); - } - }) - } - }, 150, 'checkScrolledToTopDelay') - } - } - }, - // 触发加载更多时调用,from:toBottom-滑动到底部触发;1、click-点击加载更多触发 - _onLoadingMore(from = 'click') { - // 如果是ios并且是滚动到底部的,则在滚动到底部时候尝试将列表设置为禁止滚动然后设置为允许滚动,以禁止底部bounce的效果 - if (this.isIos && from === 'toBottom' && !this.scrollToBottomBounceEnabled && this.scrollEnable) { - this.scrollEnable = false; - this.$nextTick(() => { - this.scrollEnable = true; - }) - } - // emit scrolltolower - this.$emit('scrolltolower', from); - // 如果是只使用下拉刷新 或者 禁用底部加载更多 或者 底部加载更多不是默认状态或加载失败状态 或者 是加载中状态 或者 空数据图已经展示了,则return,不触发内部加载更多逻辑 - if (this.refresherOnly || !this.loadingMoreEnabled || !(this.loadingStatus === Enum.More.Default || this.loadingStatus === Enum.More.Fail) || this.loading || this.showEmpty) return; - // #ifdef MP-WEIXIN - if (!this.isIos && !this.refresherOnly && !this.usePageScroll) { - const currentTimestamp = u.getTime(); - // 在非ios平台+scroll-view中节流处理 - if (this.loadingMoreTimeStamp > 0 && currentTimestamp - this.loadingMoreTimeStamp < 100) { - this.loadingMoreTimeStamp = 0; - return; - } - } - // #endif - // 处理加载更多数据 - this._doLoadingMore(); - }, - // 处理开始加载更多 - _doLoadingMore() { - if (this.pageNo >= this.defaultPageNo && this.loadingStatus !== Enum.More.NoMore) { - this.pageNo ++; - this._startLoading(false); - if (this.isLocalPaging) { - // 如果是本地分页,则在组件内部对数据进行分页处理,不触发@query事件 - this._localPagingQueryList(this.pageNo, this.defaultPageSize, this.localPagingLoadingTime, res => { - this.completeByTotal(res, this.totalLocalPagingList.length); - this.queryFrom = Enum.QueryFrom.LoadingMore; - }) - } else { - // emit @query相关加载更多事件 - this._emitQuery(this.pageNo, this.defaultPageSize, Enum.QueryFrom.LoadingMore); - this._callMyParentQuery(); - } - // 设置当前加载状态为底部加载更多状态 - this.loadingType = Enum.LoadingType.LoadingMore; - } - }, - // (预处理)判断当没有更多数据且分页内容未超出z-paging时是否显示没有更多数据的view - _preCheckShowNoMoreInside(newVal, scrollViewNode, pagingContainerNode) { - if (this.loadingStatus === Enum.More.NoMore && this.hideNoMoreByLimit > 0 && newVal.length) { - this.showLoadingMore = newVal.length > this.hideNoMoreByLimit; - } else if ((this.loadingStatus === Enum.More.NoMore && this.hideNoMoreInside && newVal.length) || (this.insideMore && this.insideOfPaging !== false && newVal.length)) { - this.$nextTick(() => { - this._checkShowNoMoreInside(newVal, scrollViewNode, pagingContainerNode); - }) - if (this.insideMore && this.insideOfPaging !== false && newVal.length) { - this.showLoadingMore = newVal.length; - } - } else { - this.showLoadingMore = newVal.length; - } - }, - // 判断当没有更多数据且分页内容未超出z-paging时是否显示没有更多数据的view - async _checkShowNoMoreInside(totalData, oldScrollViewNode, oldPagingContainerNode) { - try { - const scrollViewNode = oldScrollViewNode || await this._getNodeClientRect('.zp-scroll-view'); - // 在页面滚动模式下 - if (this.usePageScroll) { - if (scrollViewNode) { - // 获取滚动内容总高度 - const scrollViewTotalH = scrollViewNode[0].top + scrollViewNode[0].height; - // 如果滚动内容总高度小于窗口高度,则认为内容未超出z-paging - this.insideOfPaging = scrollViewTotalH < this.windowHeight; - // 如果需要没有更多数据时,隐藏底部加载更多view,并且内容未超过z-paging,则隐藏底部加载更多 - if (this.hideNoMoreInside) { - this.showLoadingMore = !this.insideOfPaging; - } - // 如果需要内容未超过z-paging时自动加载更多,则触发加载更多 - this._updateInsideOfPaging(); - } - } else { - // 在scroll-view滚动模式下 - const pagingContainerNode = oldPagingContainerNode || await this._getNodeClientRect('.zp-paging-container-content'); - // 获取滚动内容总高度 - const pagingContainerH = pagingContainerNode ? pagingContainerNode[0].height : 0; - // 获取z-paging内置scroll-view高度 - const scrollViewH = scrollViewNode ? scrollViewNode[0].height : 0; - // 如果滚动内容总高度小于z-paging内置scroll-view高度,则认为内容未超出z-paging - this.insideOfPaging = pagingContainerH < scrollViewH; - if (this.hideNoMoreInside) { - this.showLoadingMore = !this.insideOfPaging; - } - // 如果需要内容未超过z-paging时自动加载更多,则触发加载更多 - this._updateInsideOfPaging(); - } - } catch (e) { - // 如果发生了异常,判断totalData数组长度为0,则认为内容未超出z-paging - this.insideOfPaging = !totalData.length; - if (this.hideNoMoreInside) { - this.showLoadingMore = !this.insideOfPaging; - } - // 如果需要内容未超过z-paging时自动加载更多,则触发加载更多 - this._updateInsideOfPaging(); - } - }, - // 是否要展示上拉加载更多view - _showLoadingMore(type) { - if (!this.showLoadingMoreWhenReload && (!(this.loadingStatus === Enum.More.Default ? this.nShowBottom : true) || !this.realTotalData.length)) return false; - if (((!this.showLoadingMoreWhenReload || this.isUserPullDown || this.loadingStatus !== Enum.More.Loading) && !this.showLoadingMore) || - (!this.loadingMoreEnabled && (!this.showLoadingMoreWhenReload || this.isUserPullDown || this.loadingStatus !== Enum.More.Loading)) || this.refresherOnly) { - return false; - } - if (this.useChatRecordMode && type !== 'Loading') return false; - if (!this.zSlots) return false; - if (type === 'Custom') { - return this.showDefaultLoadingMoreText && !(this.loadingStatus === Enum.More.NoMore && !this.showLoadingMoreNoMoreView); - } - const res = this.loadingStatus === Enum.More[type] && this.zSlots[`loadingMore${type}`] && (type === 'NoMore' ? this.showLoadingMoreNoMoreView : true); - if (res) { - // #ifdef APP-NVUE - if (!this.isIos) { - this.nLoadingMoreFixedHeight = false; - } - // #endif - } - return res; - }, - } -} +// [z-paging]滚动到底部加载更多模块 +import u from '.././z-paging-utils' +import Enum from '.././z-paging-enum' + +export default { + props: { + // 自定义底部加载更多样式 + loadingMoreCustomStyle: { + type: Object, + default: u.gc('loadingMoreCustomStyle', {}) + }, + // 自定义底部加载更多文字样式 + loadingMoreTitleCustomStyle: { + type: Object, + default: u.gc('loadingMoreTitleCustomStyle', {}) + }, + // 自定义底部加载更多加载中动画样式 + loadingMoreLoadingIconCustomStyle: { + type: Object, + default: u.gc('loadingMoreLoadingIconCustomStyle', {}) + }, + // 自定义底部加载更多加载中动画图标类型,可选flower或circle,默认为flower + loadingMoreLoadingIconType: { + type: String, + default: u.gc('loadingMoreLoadingIconType', 'flower') + }, + // 自定义底部加载更多加载中动画图标图片 + loadingMoreLoadingIconCustomImage: { + type: String, + default: u.gc('loadingMoreLoadingIconCustomImage', '') + }, + // 底部加载更多加载中view是否展示旋转动画,默认为是 + loadingMoreLoadingAnimated: { + type: Boolean, + default: u.gc('loadingMoreLoadingAnimated', true) + }, + // 是否启用加载更多数据(含滑动到底部加载更多数据和点击加载更多数据),默认为是 + loadingMoreEnabled: { + type: Boolean, + default: u.gc('loadingMoreEnabled', true) + }, + // 是否启用滑动到底部加载更多数据,默认为是 + toBottomLoadingMoreEnabled: { + type: Boolean, + default: u.gc('toBottomLoadingMoreEnabled', true) + }, + // 滑动到底部状态为默认状态时,以加载中的状态展示,默认为否。若设置为是,可避免滚动到底部看到默认状态然后立刻变为加载中状态的问题,但分页数量未超过一屏时,不会显示【点击加载更多】 + loadingMoreDefaultAsLoading: { + type: Boolean, + default: u.gc('loadingMoreDefaultAsLoading', false) + }, + // 滑动到底部"默认"文字,默认为【点击加载更多】 + loadingMoreDefaultText: { + type: [String, Object], + default: u.gc('loadingMoreDefaultText', null) + }, + // 滑动到底部"加载中"文字,默认为【正在加载...】 + loadingMoreLoadingText: { + type: [String, Object], + default: u.gc('loadingMoreLoadingText', null) + }, + // 滑动到底部"没有更多"文字,默认为【没有更多了】 + loadingMoreNoMoreText: { + type: [String, Object], + default: u.gc('loadingMoreNoMoreText', null) + }, + // 滑动到底部"加载失败"文字,默认为【加载失败,点击重新加载】 + loadingMoreFailText: { + type: [String, Object], + default: u.gc('loadingMoreFailText', null) + }, + // 当没有更多数据且分页内容未超出z-paging时是否隐藏没有更多数据的view,默认为否 + hideNoMoreInside: { + type: Boolean, + default: u.gc('hideNoMoreInside', false) + }, + // 当没有更多数据且分页数组长度少于这个值时,隐藏没有更多数据的view,默认为0,代表不限制。 + hideNoMoreByLimit: { + type: Number, + default: u.gc('hideNoMoreByLimit', 0) + }, + // 是否显示默认的加载更多text,默认为是 + showDefaultLoadingMoreText: { + type: Boolean, + default: u.gc('showDefaultLoadingMoreText', true) + }, + // 是否显示没有更多数据的view + showLoadingMoreNoMoreView: { + type: Boolean, + default: u.gc('showLoadingMoreNoMoreView', true) + }, + // 是否显示没有更多数据的分割线,默认为是 + showLoadingMoreNoMoreLine: { + type: Boolean, + default: u.gc('showLoadingMoreNoMoreLine', true) + }, + // 自定义底部没有更多数据的分割线样式 + loadingMoreNoMoreLineCustomStyle: { + type: Object, + default: u.gc('loadingMoreNoMoreLineCustomStyle', {}) + }, + // 当分页未满一屏时,是否自动加载更多,默认为否(nvue无效) + insideMore: { + type: Boolean, + default: u.gc('insideMore', false) + }, + // 距底部/右边多远时(单位px),触发 scrolltolower 事件,默认为100rpx + lowerThreshold: { + type: [Number, String], + default: u.gc('lowerThreshold', '100rpx') + }, + }, + data() { + return { + M: Enum.More, + // 底部加载更多状态 + loadingStatus: Enum.More.Default, + // 在渲染之后的底部加载更多状态 + loadingStatusAfterRender: Enum.More.Default, + // 底部加载更多时间戳 + loadingMoreTimeStamp: 0, + // 底部加载更多slot + loadingMoreDefaultSlot: null, + // 是否展示底部加载更多 + showLoadingMore: false, + // 是否是开发者自定义的加载更多,-1代表交由z-paging自行判断;1代表没有更多了;0代表还有更多数据 + customNoMore: -1, + } + }, + computed: { + // 底部加载更多配置 + zLoadMoreConfig() { + return { + status: this.loadingStatusAfterRender, + defaultAsLoading: this.loadingMoreDefaultAsLoading || (this.useChatRecordMode && this.chatLoadingMoreDefaultAsLoading), + defaultThemeStyle: this.finalLoadingMoreThemeStyle, + customStyle: this.loadingMoreCustomStyle, + titleCustomStyle: this.loadingMoreTitleCustomStyle, + iconCustomStyle: this.loadingMoreLoadingIconCustomStyle, + loadingIconType: this.loadingMoreLoadingIconType, + loadingIconCustomImage: this.loadingMoreLoadingIconCustomImage, + loadingAnimated: this.loadingMoreLoadingAnimated, + showNoMoreLine: this.showLoadingMoreNoMoreLine, + noMoreLineCustomStyle: this.loadingMoreNoMoreLineCustomStyle, + defaultText: this.finalLoadingMoreDefaultText, + loadingText: this.finalLoadingMoreLoadingText, + noMoreText: this.finalLoadingMoreNoMoreText, + failText: this.finalLoadingMoreFailText, + hideContent: !this.loadingMoreDefaultAsLoading && this.listRendering, + unit: this.unit, + isChat: this.useChatRecordMode, + chatDefaultAsLoading: this.chatLoadingMoreDefaultAsLoading + }; + }, + // 最终的底部加载更多主题 + finalLoadingMoreThemeStyle() { + return this.loadingMoreThemeStyle.length ? this.loadingMoreThemeStyle : this.defaultThemeStyle; + }, + // 最终的底部加载更多触发阈值 + finalLowerThreshold() { + return u.convertToPx(this.lowerThreshold); + }, + // 是否显示默认状态下的底部加载更多 + showLoadingMoreDefault() { + return this._showLoadingMore('Default'); + }, + // 是否显示加载中状态下的底部加载更多 + showLoadingMoreLoading() { + return this._showLoadingMore('Loading'); + }, + // 是否显示没有更多了状态下的底部加载更多 + showLoadingMoreNoMore() { + return this._showLoadingMore('NoMore'); + }, + // 是否显示加载失败状态下的底部加载更多 + showLoadingMoreFail() { + return this._showLoadingMore('Fail'); + }, + // 是否显示自定义状态下的底部加载更多 + showLoadingMoreCustom() { + return this._showLoadingMore('Custom'); + } + }, + methods: { + // 页面滚动到底部时通知z-paging进行进一步处理 + pageReachBottom() { + !this.useChatRecordMode && this._onLoadingMore('toBottom'); + }, + // 手动触发上拉加载更多(非必须,可依据具体需求使用) + doLoadMore(type) { + this._onLoadingMore(type); + }, + // 通过@scroll事件检测是否滚动到了底部(顺带检测下是否滚动到了顶部) + _checkScrolledToBottom(scrollDiff, checked = false) { + // 如果当前scroll-view高度未获取,则获取其高度 + if (this.cacheScrollNodeHeight === -1) { + // 获取当前scroll-view高度 + this._getNodeClientRect('.zp-scroll-view').then((res) => { + if (res) { + const scrollNodeHeight = res[0].height; + // 缓存当前scroll-view高度,如果获取过了不再获取 + this.cacheScrollNodeHeight = scrollNodeHeight; + // // scrollDiff - this.cacheScrollNodeHeight = 当前滚动区域的顶部与内容底部的距离 - scroll-view高度 = 当前滚动区域的底部与内容底部的距离(也就是最终的与底部的距离) + if (scrollDiff - scrollNodeHeight <= this.finalLowerThreshold) { + // 如果与底部的距离小于阈值,则判断为滚动到了底部,触发滚动到底部事件 + this._onLoadingMore('toBottom'); + } + } + }); + } else { + // scrollDiff - this.cacheScrollNodeHeight = 当前滚动区域的顶部与内容底部的距离 - scroll-view高度 = 当前滚动区域的底部与内容底部的距离(也就是最终的与底部的距离) + if (scrollDiff - this.cacheScrollNodeHeight <= this.finalLowerThreshold) { + // 如果与底部的距离小于阈值,则判断为滚动到了底部,触发滚动到底部事件 + this._onLoadingMore('toBottom'); + } else if (scrollDiff - this.cacheScrollNodeHeight <= 500 && !checked) { + // 如果与底部的距离小于500px,则获取当前滚动的位置,延迟150毫秒重复上述步骤再次检测(避免@scroll触发时获取的scrollTop不正确导致的其他问题,此时获取的scrollTop不一定可信)。防止因为部分性能较差安卓设备@scroll采样率过低导致的滚动到底部但是依然没有触发的问题 + u.delay(() => { + this._getNodeClientRect('.zp-scroll-view', true, true).then((res) => { + if (res) { + this.oldScrollTop = res[0].scrollTop; + const newScrollDiff = res[0].scrollHeight - this.oldScrollTop; + this._checkScrolledToBottom(newScrollDiff, true); + } + }) + }, 150, 'checkScrolledToBottomDelay') + } + // 检测一下是否已经滚动到了顶部了,因为在安卓中滚动到顶部时scrollTop不一定为0(和滚动到底部一样的原因),所以需要在scrollTop小于150px时,通过获取.zp-scroll-view的scrollTop再判断一下 + if (this.oldScrollTop <= 150 && this.oldScrollTop !== 0) { + u.delay(() => { + // 这里再判断一下是否确实已经滚动到顶部了,如果已经滚动到顶部了,则不用再判断了,再次判断的原因是可能150毫秒之后oldScrollTop才是0 + if (this.oldScrollTop !== 0) { + this._getNodeClientRect('.zp-scroll-view', true, true).then((res) => { + // 如果150毫秒后.zp-scroll-view的scrollTop为0,则认为已经滚动到了顶部了 + if (res && res[0].scrollTop === 0 && this.oldScrollTop !== 0) { + this._onScrollToUpper(); + } + }) + } + }, 150, 'checkScrolledToTopDelay') + } + } + }, + // 触发加载更多时调用,from:toBottom-滑动到底部触发;1、click-点击加载更多触发 + _onLoadingMore(from = 'click') { + // 如果是ios并且是滚动到底部的,则在滚动到底部时候尝试将列表设置为禁止滚动然后设置为允许滚动,以禁止底部bounce的效果 + if (this.isIos && from === 'toBottom' && !this.scrollToBottomBounceEnabled && this.scrollEnable) { + this.scrollEnable = false; + this.$nextTick(() => { + this.scrollEnable = true; + }) + } + // emit scrolltolower + this.$emit('scrolltolower', from); + // 如果是只使用下拉刷新 或者 禁用底部加载更多 或者 底部加载更多不是默认状态或加载失败状态 或者 是加载中状态 或者 空数据图已经展示了,则return,不触发内部加载更多逻辑 + if (this.refresherOnly || !this.loadingMoreEnabled || !(this.loadingStatus === Enum.More.Default || this.loadingStatus === Enum.More.Fail) || this.loading || this.showEmpty) return; + // #ifdef MP-WEIXIN + if (!this.isIos && !this.refresherOnly && !this.usePageScroll) { + const currentTimestamp = u.getTime(); + // 在非ios平台+scroll-view中节流处理 + if (this.loadingMoreTimeStamp > 0 && currentTimestamp - this.loadingMoreTimeStamp < 100) { + this.loadingMoreTimeStamp = 0; + return; + } + } + // #endif + // 处理加载更多数据 + this._doLoadingMore(); + }, + // 处理开始加载更多 + _doLoadingMore() { + if (this.pageNo >= this.defaultPageNo && this.loadingStatus !== Enum.More.NoMore) { + this.pageNo ++; + this._startLoading(false); + if (this.isLocalPaging) { + // 如果是本地分页,则在组件内部对数据进行分页处理,不触发@query事件 + this._localPagingQueryList(this.pageNo, this.defaultPageSize, this.localPagingLoadingTime, res => { + this.completeByTotal(res, this.totalLocalPagingList.length); + this.queryFrom = Enum.QueryFrom.LoadingMore; + }) + } else { + // emit @query相关加载更多事件 + this._emitQuery(this.pageNo, this.defaultPageSize, Enum.QueryFrom.LoadingMore); + this._callMyParentQuery(); + } + // 设置当前加载状态为底部加载更多状态 + this.loadingType = Enum.LoadingType.LoadingMore; + } + }, + // (预处理)判断当没有更多数据且分页内容未超出z-paging时是否显示没有更多数据的view + _preCheckShowNoMoreInside(newVal, scrollViewNode, pagingContainerNode) { + if (this.loadingStatus === Enum.More.NoMore && this.hideNoMoreByLimit > 0 && newVal.length) { + this.showLoadingMore = newVal.length > this.hideNoMoreByLimit; + } else if ((this.loadingStatus === Enum.More.NoMore && this.hideNoMoreInside && newVal.length) || (this.insideMore && this.insideOfPaging !== false && newVal.length)) { + this.$nextTick(() => { + this._checkShowNoMoreInside(newVal, scrollViewNode, pagingContainerNode); + }) + if (this.insideMore && this.insideOfPaging !== false && newVal.length) { + this.showLoadingMore = newVal.length; + } + } else { + this.showLoadingMore = newVal.length; + } + }, + // 判断当没有更多数据且分页内容未超出z-paging时是否显示没有更多数据的view + async _checkShowNoMoreInside(totalData, oldScrollViewNode, oldPagingContainerNode) { + try { + const scrollViewNode = oldScrollViewNode || await this._getNodeClientRect('.zp-scroll-view'); + // 在页面滚动模式下 + if (this.usePageScroll) { + if (scrollViewNode) { + // 获取滚动内容总高度 + const scrollViewTotalH = scrollViewNode[0].top + scrollViewNode[0].height; + // 如果滚动内容总高度小于窗口高度,则认为内容未超出z-paging + this.insideOfPaging = scrollViewTotalH < this.windowHeight; + // 如果需要没有更多数据时,隐藏底部加载更多view,并且内容未超过z-paging,则隐藏底部加载更多 + if (this.hideNoMoreInside) { + this.showLoadingMore = !this.insideOfPaging; + } + // 如果需要内容未超过z-paging时自动加载更多,则触发加载更多 + this._updateInsideOfPaging(); + } + } else { + // 在scroll-view滚动模式下 + const pagingContainerNode = oldPagingContainerNode || await this._getNodeClientRect('.zp-paging-container-content'); + // 获取滚动内容总高度 + const pagingContainerH = pagingContainerNode ? pagingContainerNode[0].height : 0; + // 获取z-paging内置scroll-view高度 + const scrollViewH = scrollViewNode ? scrollViewNode[0].height : 0; + // 如果滚动内容总高度小于z-paging内置scroll-view高度,则认为内容未超出z-paging + this.insideOfPaging = pagingContainerH < scrollViewH; + if (this.hideNoMoreInside) { + this.showLoadingMore = !this.insideOfPaging; + } + // 如果需要内容未超过z-paging时自动加载更多,则触发加载更多 + this._updateInsideOfPaging(); + } + } catch (e) { + // 如果发生了异常,判断totalData数组长度为0,则认为内容未超出z-paging + this.insideOfPaging = !totalData.length; + if (this.hideNoMoreInside) { + this.showLoadingMore = !this.insideOfPaging; + } + // 如果需要内容未超过z-paging时自动加载更多,则触发加载更多 + this._updateInsideOfPaging(); + } + }, + // 是否要展示上拉加载更多view + _showLoadingMore(type) { + if (!this.showLoadingMoreWhenReload && (!(this.loadingStatus === Enum.More.Default ? this.nShowBottom : true) || !this.realTotalData.length)) return false; + if (((!this.showLoadingMoreWhenReload || this.isUserPullDown || this.loadingStatus !== Enum.More.Loading) && !this.showLoadingMore) || + (!this.loadingMoreEnabled && (!this.showLoadingMoreWhenReload || this.isUserPullDown || this.loadingStatus !== Enum.More.Loading)) || this.refresherOnly) { + return false; + } + if (this.useChatRecordMode && type !== 'Loading') return false; + if (!this.zSlots) return false; + if (type === 'Custom') { + return this.showDefaultLoadingMoreText && !(this.loadingStatus === Enum.More.NoMore && !this.showLoadingMoreNoMoreView); + } + const res = this.loadingStatus === Enum.More[type] && this.zSlots[`loadingMore${type}`] && (type === 'NoMore' ? this.showLoadingMoreNoMoreView : true); + if (res) { + // #ifdef APP-NVUE + if (!this.isIos) { + this.nLoadingMoreFixedHeight = false; + } + // #endif + } + return res; + }, + } +} diff --git a/uni_modules/z-paging/components/z-paging/js/modules/loading.js b/uni_modules/z-paging/components/z-paging/js/modules/loading.js index 19596ceb..7f40aecd 100644 --- a/uni_modules/z-paging/components/z-paging/js/modules/loading.js +++ b/uni_modules/z-paging/components/z-paging/js/modules/loading.js @@ -1,95 +1,95 @@ -// [z-paging]loading相关模块 -import u from '.././z-paging-utils' -import Enum from '.././z-paging-enum' - -export default { - props: { - // 第一次加载后自动隐藏loading slot,默认为是 - autoHideLoadingAfterFirstLoaded: { - type: Boolean, - default: u.gc('autoHideLoadingAfterFirstLoaded', true) - }, - // loading slot是否铺满屏幕并固定,默认为否 - loadingFullFixed: { - type: Boolean, - default: u.gc('loadingFullFixed', false) - }, - // 是否自动显示系统Loading:即uni.showLoading,若开启则将在刷新列表时(调用reload、refresh时)显示,下拉刷新和滚动到底部加载更多不会显示,默认为false。 - autoShowSystemLoading: { - type: Boolean, - default: u.gc('autoShowSystemLoading', false) - }, - // 显示系统Loading时是否显示透明蒙层,防止触摸穿透,默认为是(H5、App、微信小程序、百度小程序有效) - systemLoadingMask: { - type: Boolean, - default: u.gc('systemLoadingMask', true) - }, - // 显示系统Loading时显示的文字,默认为"加载中" - systemLoadingText: { - type: [String, Object], - default: u.gc('systemLoadingText', null) - }, - }, - data() { - return { - loading: false, - loadingForNow: false, - } - }, - watch: { - // loading状态 - loadingStatus(newVal) { - this.$emit('loadingStatusChange', newVal); - this.$nextTick(() => { - this.loadingStatusAfterRender = newVal; - }) - if (this.useChatRecordMode) { - if (this.isFirstPage && (newVal === Enum.More.NoMore || newVal === Enum.More.Fail)) { - this.isFirstPageAndNoMore = true; - return; - } - } - this.isFirstPageAndNoMore = false; - }, - loading(newVal){ - if (newVal) { - this.loadingForNow = newVal; - } - }, - }, - computed: { - // 是否显示loading - showLoading() { - if (this.firstPageLoaded || !this.loading || !this.loadingForNow) return false; - if (this.finalShowSystemLoading) { - // 显示系统loading - uni.showLoading({ - title: this.finalSystemLoadingText, - mask: this.systemLoadingMask - }) - } - return this.autoHideLoadingAfterFirstLoaded ? (this.fromEmptyViewReload ? true : !this.pagingLoaded) : this.loadingType === Enum.LoadingType.Refresher; - }, - // 最终的是否显示系统loading - finalShowSystemLoading() { - return this.autoShowSystemLoading && this.loadingType === Enum.LoadingType.Refresher; - } - }, - methods: { - // 处理开始加载更多状态 - _startLoading(isReload = false) { - if ((this.showLoadingMoreWhenReload && !this.isUserPullDown) || !isReload) { - this.loadingStatus = Enum.More.Loading; - } - this.loading = true; - }, - // 停止系统loading和refresh - _endSystemLoadingAndRefresh(){ - this.finalShowSystemLoading && uni.hideLoading(); - !this.useCustomRefresher && uni.stopPullDownRefresh(); - // #ifdef APP-NVUE - this.usePageScroll && uni.stopPullDownRefresh(); - // #endif - } - } -} +// [z-paging]loading相关模块 +import u from '.././z-paging-utils' +import Enum from '.././z-paging-enum' + +export default { + props: { + // 第一次加载后自动隐藏loading slot,默认为是 + autoHideLoadingAfterFirstLoaded: { + type: Boolean, + default: u.gc('autoHideLoadingAfterFirstLoaded', true) + }, + // loading slot是否铺满屏幕并固定,默认为否 + loadingFullFixed: { + type: Boolean, + default: u.gc('loadingFullFixed', false) + }, + // 是否自动显示系统Loading:即uni.showLoading,若开启则将在刷新列表时(调用reload、refresh时)显示,下拉刷新和滚动到底部加载更多不会显示,默认为false。 + autoShowSystemLoading: { + type: Boolean, + default: u.gc('autoShowSystemLoading', false) + }, + // 显示系统Loading时是否显示透明蒙层,防止触摸穿透,默认为是(H5、App、微信小程序、百度小程序有效) + systemLoadingMask: { + type: Boolean, + default: u.gc('systemLoadingMask', true) + }, + // 显示系统Loading时显示的文字,默认为"加载中" + systemLoadingText: { + type: [String, Object], + default: u.gc('systemLoadingText', null) + }, + }, + data() { + return { + loading: false, + loadingForNow: false, + } + }, + watch: { + // loading状态 + loadingStatus(newVal) { + this.$emit('loadingStatusChange', newVal); + this.$nextTick(() => { + this.loadingStatusAfterRender = newVal; + }) + if (this.useChatRecordMode) { + if (this.isFirstPage && (newVal === Enum.More.NoMore || newVal === Enum.More.Fail)) { + this.isFirstPageAndNoMore = true; + return; + } + } + this.isFirstPageAndNoMore = false; + }, + loading(newVal){ + if (newVal) { + this.loadingForNow = newVal; + } + }, + }, + computed: { + // 是否显示loading + showLoading() { + if (this.firstPageLoaded || !this.loading || !this.loadingForNow) return false; + if (this.finalShowSystemLoading) { + // 显示系统loading + uni.showLoading({ + title: this.finalSystemLoadingText, + mask: this.systemLoadingMask + }) + } + return this.autoHideLoadingAfterFirstLoaded ? (this.fromEmptyViewReload ? true : !this.pagingLoaded) : this.loadingType === Enum.LoadingType.Refresher; + }, + // 最终的是否显示系统loading + finalShowSystemLoading() { + return this.autoShowSystemLoading && this.loadingType === Enum.LoadingType.Refresher; + } + }, + methods: { + // 处理开始加载更多状态 + _startLoading(isReload = false) { + if ((this.showLoadingMoreWhenReload && !this.isUserPullDown) || !isReload) { + this.loadingStatus = Enum.More.Loading; + } + this.loading = true; + }, + // 停止系统loading和refresh + _endSystemLoadingAndRefresh(){ + this.finalShowSystemLoading && uni.hideLoading(); + !this.useCustomRefresher && uni.stopPullDownRefresh(); + // #ifdef APP-NVUE + this.usePageScroll && uni.stopPullDownRefresh(); + // #endif + } + } +} diff --git a/uni_modules/z-paging/components/z-paging/js/modules/nvue.js b/uni_modules/z-paging/components/z-paging/js/modules/nvue.js index 300b084b..30c21427 100644 --- a/uni_modules/z-paging/components/z-paging/js/modules/nvue.js +++ b/uni_modules/z-paging/components/z-paging/js/modules/nvue.js @@ -1,255 +1,255 @@ -// [z-paging]nvue独有部分模块 -import u from '.././z-paging-utils' -import c from '.././z-paging-constant' -import Enum from '.././z-paging-enum' - -// #ifdef APP-NVUE -const weexAnimation = weex.requireModule('animation'); -// #endif -export default { - props: { - // #ifdef APP-NVUE - // nvue中修改列表类型,可选值有list、waterfall和scroller,默认为list - nvueListIs: { - type: String, - default: u.gc('nvueListIs', 'list') - }, - // nvue waterfall配置,仅在nvue中且nvueListIs=waterfall时有效,配置参数详情参见:https://uniapp.dcloud.io/component/waterfall - nvueWaterfallConfig: { - type: Object, - default: u.gc('nvueWaterfallConfig', {}) - }, - // nvue 控制是否回弹效果,iOS不支持动态修改 - nvueBounce: { - type: Boolean, - default: u.gc('nvueBounce', true) - }, - // nvue中通过代码滚动到顶部/底部时,是否加快动画效果(无滚动动画时无效),默认为否 - nvueFastScroll: { - type: Boolean, - default: u.gc('nvueFastScroll', false) - }, - // nvue中list的id - nvueListId: { - type: String, - default: u.gc('nvueListId', '') - }, - // nvue中refresh组件的样式 - nvueRefresherStyle: { - type: Object, - default: u.gc('nvueRefresherStyle', {}) - }, - // nvue中是否按分页模式(类似竖向swiper)显示List,默认为false - nvuePagingEnabled: { - type: Boolean, - default: u.gc('nvuePagingEnabled', false) - }, - // 是否隐藏nvue列表底部的tagView,此view用于标识滚动到底部位置,若隐藏则滚动到底部功能将失效,在nvue中实现吸顶+swiper功能时需将最外层z-paging的此属性设置为true。默认为否 - hideNvueBottomTag: { - type: Boolean, - default: u.gc('hideNvueBottomTag', false) - }, - // nvue中控制onscroll事件触发的频率:表示两次onscroll事件之间列表至少滚动了10px。注意,将该值设置为较小的数值会提高滚动事件采样的精度,但同时也会降低页面的性能 - offsetAccuracy: { - type: Number, - default: u.gc('offsetAccuracy', 10) - }, - // #endif - }, - data() { - return { - nRefresherLoading: false, - nListIsDragging: false, - nShowBottom: true, - nFixFreezing: false, - nShowRefresherReveal: false, - nLoadingMoreFixedHeight: false, - nShowRefresherRevealHeight: 0, - nOldShowRefresherRevealHeight: -1, - nRefresherWidth: uni.upx2px(750), - nF2Opacity: 0 - } - }, - computed: { - // #ifdef APP-NVUE - nScopedSlots() { - // #ifdef VUE2 - return this.$scopedSlots; - // #endif - // #ifdef VUE3 - return null; - // #endif - }, - nWaterfallColumnCount() { - if (this.finalNvueListIs !== 'waterfall') return 0; - return this._nGetWaterfallConfig('column-count', 2); - }, - nWaterfallColumnWidth() { - return this._nGetWaterfallConfig('column-width', 'auto'); - }, - nWaterfallColumnGap() { - return this._nGetWaterfallConfig('column-gap', 'normal'); - }, - nWaterfallLeftGap() { - return this._nGetWaterfallConfig('left-gap', 0); - }, - nWaterfallRightGap() { - return this._nGetWaterfallConfig('right-gap', 0); - }, - nViewIs() { - const is = this.finalNvueListIs; - return is === 'scroller' || is === 'view' ? 'view' : is === 'waterfall' ? 'header' : 'cell'; - }, - nSafeAreaBottomHeight() { - return this.safeAreaInsetBottom ? this.safeAreaBottom : 0; - }, - finalNvueListIs() { - if (this.usePageScroll) return 'view'; - const nvueListIsLowerCase = this.nvueListIs.toLowerCase(); - if (['list','waterfall','scroller'].indexOf(nvueListIsLowerCase) !== -1) return nvueListIsLowerCase; - return 'list'; - }, - finalNvueSuperListIs() { - return this.usePageScroll ? 'view' : 'scroller'; - }, - finalNvueRefresherEnabled() { - return this.finalNvueListIs !== 'view' && this.finalRefresherEnabled && !this.nShowRefresherReveal && !this.useChatRecordMode; - }, - // #endif - }, - mounted(){ - // #ifdef APP-NVUE - //旋转屏幕时更新宽度 - uni.onWindowResize((res) => { - // this._nUpdateRefresherWidth(); - }) - // #endif - }, - methods: { - // #ifdef APP-NVUE - // 列表滚动时触发 - _nOnScroll(e) { - this.$emit('scroll', e); - const contentOffsetY = -e.contentOffset.y; - this.oldScrollTop = contentOffsetY; - this.nListIsDragging = e.isDragging; - this._checkShouldShowBackToTop(contentOffsetY, contentOffsetY - 1); - }, - // 列表滚动结束 - _nOnScrollend(e) { - this.$emit('scrollend', e); - }, - // 下拉刷新刷新中 - _nOnRrefresh() { - if (this.nShowRefresherReveal) return; - // 进入刷新状态 - this.nRefresherLoading = true; - if (this.refresherStatus === Enum.Refresher.GoF2) { - this._handleGoF2(); - this.$nextTick(() => { - this._nRefresherEnd(); - }) - } else { - this.refresherStatus = Enum.Refresher.Loading; - this._doRefresherLoad(); - } - - }, - // 下拉刷新下拉中 - _nOnPullingdown(e) { - if (this.refresherStatus === Enum.Refresher.Loading || (this.isIos && !this.nListIsDragging)) return; - this._emitTouchmove(e); - let { viewHeight, pullingDistance } = e; - // 更新下拉刷新状态 - // 下拉刷新距离超过阈值 - if (pullingDistance >= viewHeight) { - // 如果开启了下拉进入二楼并且下拉刷新距离超过进入二楼阈值,则当前下拉刷新状态为松手进入二楼,否则为松手立即刷新 - // (pullingDistance - viewHeight) + this.finalRefresherThreshold 不等同于pullingDistance,此处是为了兼容不同平台下拉相同距离pullingDistance不一致的问题,pullingDistance仅与viewHeight互相关联 - this.refresherStatus = this.refresherF2Enabled && (pullingDistance - viewHeight) + this.finalRefresherThreshold >= this.finalRefresherF2Threshold ? Enum.Refresher.GoF2 : Enum.Refresher.ReleaseToRefresh; - } else { - // 下拉刷新距离未超过阈值,显示默认状态 - this.refresherStatus = Enum.Refresher.Default; - } - }, - // 下拉刷新结束 - _nRefresherEnd(doEnd = true) { - if (doEnd) { - this._nDoRefresherEndAnimation(0, -this.nShowRefresherRevealHeight); - !this.usePageScroll && this.$refs['zp-n-list'].resetLoadmore(); - this.nRefresherLoading = false; - } - }, - // 执行主动触发下拉刷新动画 - _nDoRefresherEndAnimation(height, translateY, animate = true, checkStack = true) { - // 清除下拉刷新相关timeout - this._cleanRefresherCompleteTimeout(); - this._cleanRefresherEndTimeout(); - - if (!this.finalShowRefresherWhenReload) { - // 如果reload不需要自动展示下拉刷新view,则在complete duration结束后再把下拉刷新状态设置回默认 - this.refresherEndTimeout = u.delay(() => { - this.refresherStatus = Enum.Refresher.Default; - }, this.refresherCompleteDuration); - return; - } - // 用户处理用户在短时间内多次调用reload的情况,此时下拉刷新view不需要重复显示,只需要保证最后一次reload对应的请求结束后收回下拉刷新view即可 - const stackCount = this.refresherRevealStackCount; - if (height === 0 && checkStack) { - this.refresherRevealStackCount --; - if (stackCount > 1) return; - this.refresherEndTimeout = u.delay(() => { - this.refresherStatus = Enum.Refresher.Default; - }, this.refresherCompleteDuration); - } - if (stackCount > 1) { - this.refresherStatus = Enum.Refresher.Loading; - } - - const duration = animate ? 200 : 0; - if (this.nOldShowRefresherRevealHeight !== height) { - if (height > 0) { - this.nShowRefresherReveal = true; - } - // 展示下拉刷新view - weexAnimation.transition(this.$refs['zp-n-list-refresher-reveal'], { - styles: { - height: `${height}px`, - transform: `translateY(${translateY}px)`, - }, - duration, - timingFunction: 'linear', - needLayout: true, - delay: 0 - }) - } - u.delay(() => { - if (animate) { - this.nShowRefresherReveal = height > 0; - } - }, duration > 0 ? duration - 60 : 0); - this.nOldShowRefresherRevealHeight = height; - }, - // 滚动到底部加载更多 - _nOnLoadmore() { - if (this.nShowRefresherReveal || !this.totalData.length) return; - this.useChatRecordMode ? this.doChatRecordLoadMore() : this._onLoadingMore('toBottom'); - }, - // 获取nvue waterfall单项配置 - _nGetWaterfallConfig(key, defaultValue) { - return this.nvueWaterfallConfig[key] || defaultValue; - }, - // 更新nvue 下拉刷新view容器的宽度 - _nUpdateRefresherWidth() { - u.delay(() => { - this.$nextTick(()=>{ - this._getNodeClientRect('.zp-n-list').then(node => { - if (node) { - this.nRefresherWidth = node[0].width || this.nRefresherWidth; - } - }) - }) - }) - } - // #endif - } -} +// [z-paging]nvue独有部分模块 +import u from '.././z-paging-utils' +import c from '.././z-paging-constant' +import Enum from '.././z-paging-enum' + +// #ifdef APP-NVUE +const weexAnimation = weex.requireModule('animation'); +// #endif +export default { + props: { + // #ifdef APP-NVUE + // nvue中修改列表类型,可选值有list、waterfall和scroller,默认为list + nvueListIs: { + type: String, + default: u.gc('nvueListIs', 'list') + }, + // nvue waterfall配置,仅在nvue中且nvueListIs=waterfall时有效,配置参数详情参见:https://uniapp.dcloud.io/component/waterfall + nvueWaterfallConfig: { + type: Object, + default: u.gc('nvueWaterfallConfig', {}) + }, + // nvue 控制是否回弹效果,iOS不支持动态修改 + nvueBounce: { + type: Boolean, + default: u.gc('nvueBounce', true) + }, + // nvue中通过代码滚动到顶部/底部时,是否加快动画效果(无滚动动画时无效),默认为否 + nvueFastScroll: { + type: Boolean, + default: u.gc('nvueFastScroll', false) + }, + // nvue中list的id + nvueListId: { + type: String, + default: u.gc('nvueListId', '') + }, + // nvue中refresh组件的样式 + nvueRefresherStyle: { + type: Object, + default: u.gc('nvueRefresherStyle', {}) + }, + // nvue中是否按分页模式(类似竖向swiper)显示List,默认为false + nvuePagingEnabled: { + type: Boolean, + default: u.gc('nvuePagingEnabled', false) + }, + // 是否隐藏nvue列表底部的tagView,此view用于标识滚动到底部位置,若隐藏则滚动到底部功能将失效,在nvue中实现吸顶+swiper功能时需将最外层z-paging的此属性设置为true。默认为否 + hideNvueBottomTag: { + type: Boolean, + default: u.gc('hideNvueBottomTag', false) + }, + // nvue中控制onscroll事件触发的频率:表示两次onscroll事件之间列表至少滚动了10px。注意,将该值设置为较小的数值会提高滚动事件采样的精度,但同时也会降低页面的性能 + offsetAccuracy: { + type: Number, + default: u.gc('offsetAccuracy', 10) + }, + // #endif + }, + data() { + return { + nRefresherLoading: false, + nListIsDragging: false, + nShowBottom: true, + nFixFreezing: false, + nShowRefresherReveal: false, + nLoadingMoreFixedHeight: false, + nShowRefresherRevealHeight: 0, + nOldShowRefresherRevealHeight: -1, + nRefresherWidth: uni.upx2px(750), + nF2Opacity: 0 + } + }, + computed: { + // #ifdef APP-NVUE + nScopedSlots() { + // #ifdef VUE2 + return this.$scopedSlots; + // #endif + // #ifdef VUE3 + return null; + // #endif + }, + nWaterfallColumnCount() { + if (this.finalNvueListIs !== 'waterfall') return 0; + return this._nGetWaterfallConfig('column-count', 2); + }, + nWaterfallColumnWidth() { + return this._nGetWaterfallConfig('column-width', 'auto'); + }, + nWaterfallColumnGap() { + return this._nGetWaterfallConfig('column-gap', 'normal'); + }, + nWaterfallLeftGap() { + return this._nGetWaterfallConfig('left-gap', 0); + }, + nWaterfallRightGap() { + return this._nGetWaterfallConfig('right-gap', 0); + }, + nViewIs() { + const is = this.finalNvueListIs; + return is === 'scroller' || is === 'view' ? 'view' : is === 'waterfall' ? 'header' : 'cell'; + }, + nSafeAreaBottomHeight() { + return this.safeAreaInsetBottom ? this.safeAreaBottom : 0; + }, + finalNvueListIs() { + if (this.usePageScroll) return 'view'; + const nvueListIsLowerCase = this.nvueListIs.toLowerCase(); + if (['list','waterfall','scroller'].indexOf(nvueListIsLowerCase) !== -1) return nvueListIsLowerCase; + return 'list'; + }, + finalNvueSuperListIs() { + return this.usePageScroll ? 'view' : 'scroller'; + }, + finalNvueRefresherEnabled() { + return this.finalNvueListIs !== 'view' && this.finalRefresherEnabled && !this.nShowRefresherReveal && !this.useChatRecordMode; + }, + // #endif + }, + mounted(){ + // #ifdef APP-NVUE + //旋转屏幕时更新宽度 + uni.onWindowResize((res) => { + // this._nUpdateRefresherWidth(); + }) + // #endif + }, + methods: { + // #ifdef APP-NVUE + // 列表滚动时触发 + _nOnScroll(e) { + this.$emit('scroll', e); + const contentOffsetY = -e.contentOffset.y; + this.oldScrollTop = contentOffsetY; + this.nListIsDragging = e.isDragging; + this._checkShouldShowBackToTop(contentOffsetY, contentOffsetY - 1); + }, + // 列表滚动结束 + _nOnScrollend(e) { + this.$emit('scrollend', e); + }, + // 下拉刷新刷新中 + _nOnRrefresh() { + if (this.nShowRefresherReveal) return; + // 进入刷新状态 + this.nRefresherLoading = true; + if (this.refresherStatus === Enum.Refresher.GoF2) { + this._handleGoF2(); + this.$nextTick(() => { + this._nRefresherEnd(); + }) + } else { + this.refresherStatus = Enum.Refresher.Loading; + this._doRefresherLoad(); + } + + }, + // 下拉刷新下拉中 + _nOnPullingdown(e) { + if (this.refresherStatus === Enum.Refresher.Loading || (this.isIos && !this.nListIsDragging)) return; + this._emitTouchmove(e); + let { viewHeight, pullingDistance } = e; + // 更新下拉刷新状态 + // 下拉刷新距离超过阈值 + if (pullingDistance >= viewHeight) { + // 如果开启了下拉进入二楼并且下拉刷新距离超过进入二楼阈值,则当前下拉刷新状态为松手进入二楼,否则为松手立即刷新 + // (pullingDistance - viewHeight) + this.finalRefresherThreshold 不等同于pullingDistance,此处是为了兼容不同平台下拉相同距离pullingDistance不一致的问题,pullingDistance仅与viewHeight互相关联 + this.refresherStatus = this.refresherF2Enabled && (pullingDistance - viewHeight) + this.finalRefresherThreshold >= this.finalRefresherF2Threshold ? Enum.Refresher.GoF2 : Enum.Refresher.ReleaseToRefresh; + } else { + // 下拉刷新距离未超过阈值,显示默认状态 + this.refresherStatus = Enum.Refresher.Default; + } + }, + // 下拉刷新结束 + _nRefresherEnd(doEnd = true) { + if (doEnd) { + this._nDoRefresherEndAnimation(0, -this.nShowRefresherRevealHeight); + !this.usePageScroll && this.$refs['zp-n-list'].resetLoadmore(); + this.nRefresherLoading = false; + } + }, + // 执行主动触发下拉刷新动画 + _nDoRefresherEndAnimation(height, translateY, animate = true, checkStack = true) { + // 清除下拉刷新相关timeout + this._cleanRefresherCompleteTimeout(); + this._cleanRefresherEndTimeout(); + + if (!this.finalShowRefresherWhenReload) { + // 如果reload不需要自动展示下拉刷新view,则在complete duration结束后再把下拉刷新状态设置回默认 + this.refresherEndTimeout = u.delay(() => { + this.refresherStatus = Enum.Refresher.Default; + }, this.refresherCompleteDuration); + return; + } + // 用户处理用户在短时间内多次调用reload的情况,此时下拉刷新view不需要重复显示,只需要保证最后一次reload对应的请求结束后收回下拉刷新view即可 + const stackCount = this.refresherRevealStackCount; + if (height === 0 && checkStack) { + this.refresherRevealStackCount --; + if (stackCount > 1) return; + this.refresherEndTimeout = u.delay(() => { + this.refresherStatus = Enum.Refresher.Default; + }, this.refresherCompleteDuration); + } + if (stackCount > 1) { + this.refresherStatus = Enum.Refresher.Loading; + } + + const duration = animate ? 200 : 0; + if (this.nOldShowRefresherRevealHeight !== height) { + if (height > 0) { + this.nShowRefresherReveal = true; + } + // 展示下拉刷新view + weexAnimation.transition(this.$refs['zp-n-list-refresher-reveal'], { + styles: { + height: `${height}px`, + transform: `translateY(${translateY}px)`, + }, + duration, + timingFunction: 'linear', + needLayout: true, + delay: 0 + }) + } + u.delay(() => { + if (animate) { + this.nShowRefresherReveal = height > 0; + } + }, duration > 0 ? duration - 60 : 0); + this.nOldShowRefresherRevealHeight = height; + }, + // 滚动到底部加载更多 + _nOnLoadmore() { + if (this.nShowRefresherReveal || !this.totalData.length) return; + this.useChatRecordMode ? this.doChatRecordLoadMore() : this._onLoadingMore('toBottom'); + }, + // 获取nvue waterfall单项配置 + _nGetWaterfallConfig(key, defaultValue) { + return this.nvueWaterfallConfig[key] || defaultValue; + }, + // 更新nvue 下拉刷新view容器的宽度 + _nUpdateRefresherWidth() { + u.delay(() => { + this.$nextTick(()=>{ + this._getNodeClientRect('.zp-n-list').then(node => { + if (node) { + this.nRefresherWidth = node[0].width || this.nRefresherWidth; + } + }) + }) + }) + } + // #endif + } +} diff --git a/uni_modules/z-paging/components/z-paging/js/modules/refresher.js b/uni_modules/z-paging/components/z-paging/js/modules/refresher.js index 9507ddda..cf7da222 100644 --- a/uni_modules/z-paging/components/z-paging/js/modules/refresher.js +++ b/uni_modules/z-paging/components/z-paging/js/modules/refresher.js @@ -1,824 +1,824 @@ -// [z-paging]下拉刷新view模块 -import u from '.././z-paging-utils' -import c from '.././z-paging-constant' -import Enum from '.././z-paging-enum' - -// #ifdef APP-NVUE -const weexAnimation = weex.requireModule('animation'); -// #endif -export default { - props: { - // 下拉刷新的主题样式,支持black,white,默认black - refresherThemeStyle: { - type: String, - default: u.gc('refresherThemeStyle', '') - }, - // 自定义下拉刷新中左侧图标的样式 - refresherImgStyle: { - type: Object, - default: u.gc('refresherImgStyle', {}) - }, - // 自定义下拉刷新中右侧状态描述文字的样式 - refresherTitleStyle: { - type: Object, - default: u.gc('refresherTitleStyle', {}) - }, - // 自定义下拉刷新中右侧最后更新时间文字的样式(show-refresher-update-time为true时有效) - refresherUpdateTimeStyle: { - type: Object, - default: u.gc('refresherUpdateTimeStyle', {}) - }, - // 在微信小程序和QQ小程序中,是否实时监听下拉刷新中进度,默认为否 - watchRefresherTouchmove: { - type: Boolean, - default: u.gc('watchRefresherTouchmove', false) - }, - // 底部加载更多的主题样式,支持black,white,默认black - loadingMoreThemeStyle: { - type: String, - default: u.gc('loadingMoreThemeStyle', '') - }, - // 是否只使用下拉刷新,设置为true后将关闭mounted自动请求数据、关闭滚动到底部加载更多,强制隐藏空数据图。默认为否 - refresherOnly: { - type: Boolean, - default: u.gc('refresherOnly', false) - }, - // 自定义下拉刷新默认状态下回弹动画时间,单位为毫秒,默认为100毫秒,nvue无效 - refresherDefaultDuration: { - type: [Number, String], - default: u.gc('refresherDefaultDuration', 100) - }, - // 自定义下拉刷新结束以后延迟回弹的时间,单位为毫秒,默认为0 - refresherCompleteDelay: { - type: [Number, String], - default: u.gc('refresherCompleteDelay', 0) - }, - // 自定义下拉刷新结束回弹动画时间,单位为毫秒,默认为300毫秒(refresherEndBounceEnabled为false时,refresherCompleteDuration为设定值的1/3),nvue无效 - refresherCompleteDuration: { - type: [Number, String], - default: u.gc('refresherCompleteDuration', 300) - }, - // 自定义下拉刷新中是否允许列表滚动,默认为是 - refresherRefreshingScrollable: { - type: Boolean, - default: u.gc('refresherRefreshingScrollable', true) - }, - // 自定义下拉刷新结束状态下是否允许列表滚动,默认为否 - refresherCompleteScrollable: { - type: Boolean, - default: u.gc('refresherCompleteScrollable', false) - }, - // 是否使用自定义的下拉刷新,默认为是,即使用z-paging的下拉刷新。设置为false即代表使用uni scroll-view自带的下拉刷新,h5、App、微信小程序以外的平台不支持uni scroll-view自带的下拉刷新 - useCustomRefresher: { - type: Boolean, - default: u.gc('useCustomRefresher', true) - }, - // 自定义下拉刷新下拉帧率,默认为40,过高可能会出现抖动问题 - refresherFps: { - type: [Number, String], - default: u.gc('refresherFps', 40) - }, - // 自定义下拉刷新允许触发的最大下拉角度,默认为40度,当下拉角度小于设定值时,自定义下拉刷新动画不会被触发 - refresherMaxAngle: { - type: [Number, String], - default: u.gc('refresherMaxAngle', 40) - }, - // 自定义下拉刷新的角度由未达到最大角度变到达到最大角度时,是否继续下拉刷新手势,默认为否 - refresherAngleEnableChangeContinued: { - type: Boolean, - default: u.gc('refresherAngleEnableChangeContinued', false) - }, - // 自定义下拉刷新默认状态下的文字 - refresherDefaultText: { - type: [String, Object], - default: u.gc('refresherDefaultText', null) - }, - // 自定义下拉刷新松手立即刷新状态下的文字 - refresherPullingText: { - type: [String, Object], - default: u.gc('refresherPullingText', null) - }, - // 自定义下拉刷新刷新中状态下的文字 - refresherRefreshingText: { - type: [String, Object], - default: u.gc('refresherRefreshingText', null) - }, - // 自定义下拉刷新刷新结束状态下的文字 - refresherCompleteText: { - type: [String, Object], - default: u.gc('refresherCompleteText', null) - }, - // 自定义继续下拉进入二楼文字 - refresherGoF2Text: { - type: [String, Object], - default: u.gc('refresherGoF2Text', null) - }, - // 自定义下拉刷新默认状态下的图片 - refresherDefaultImg: { - type: String, - default: u.gc('refresherDefaultImg', null) - }, - // 自定义下拉刷新松手立即刷新状态下的图片,默认与refresherDefaultImg一致 - refresherPullingImg: { - type: String, - default: u.gc('refresherPullingImg', null) - }, - // 自定义下拉刷新刷新中状态下的图片 - refresherRefreshingImg: { - type: String, - default: u.gc('refresherRefreshingImg', null) - }, - // 自定义下拉刷新刷新结束状态下的图片 - refresherCompleteImg: { - type: String, - default: u.gc('refresherCompleteImg', null) - }, - // 自定义下拉刷新刷新中状态下是否展示旋转动画 - refresherRefreshingAnimated: { - type: Boolean, - default: u.gc('refresherRefreshingAnimated', true) - }, - // 是否开启自定义下拉刷新刷新结束回弹效果,默认为是 - refresherEndBounceEnabled: { - type: Boolean, - default: u.gc('refresherEndBounceEnabled', true) - }, - // 是否开启自定义下拉刷新,默认为是 - refresherEnabled: { - type: Boolean, - default: u.gc('refresherEnabled', true) - }, - // 设置自定义下拉刷新阈值,默认为80rpx - refresherThreshold: { - type: [Number, String], - default: u.gc('refresherThreshold', '80rpx') - }, - // 设置系统下拉刷新默认样式,支持设置 black,white,none,none 表示不使用默认样式,默认为black - refresherDefaultStyle: { - type: String, - default: u.gc('refresherDefaultStyle', 'black') - }, - // 设置自定义下拉刷新区域背景 - refresherBackground: { - type: String, - default: u.gc('refresherBackground', 'transparent') - }, - // 设置固定的自定义下拉刷新区域背景 - refresherFixedBackground: { - type: String, - default: u.gc('refresherFixedBackground', 'transparent') - }, - // 设置固定的自定义下拉刷新区域高度,默认为0 - refresherFixedBacHeight: { - type: [Number, String], - default: u.gc('refresherFixedBacHeight', 0) - }, - // 设置自定义下拉刷新下拉超出阈值后继续下拉位移衰减的比例,范围0-1,值越大代表衰减越多。默认为0.65(nvue无效) - refresherOutRate: { - type: Number, - default: u.gc('refresherOutRate', 0.65) - }, - // 是否开启下拉进入二楼功能,默认为否 - refresherF2Enabled: { - type: Boolean, - default: u.gc('refresherF2Enabled', false) - }, - // 下拉进入二楼阈值,默认为200rpx - refresherF2Threshold: { - type: [Number, String], - default: u.gc('refresherF2Threshold', '200rpx') - }, - // 下拉进入二楼动画时间,单位为毫秒,默认为200毫秒 - refresherF2Duration: { - type: [Number, String], - default: u.gc('refresherF2Duration', 200) - }, - // 下拉进入二楼状态松手后是否弹出二楼,默认为是 - showRefresherF2: { - type: Boolean, - default: u.gc('showRefresherF2', true) - }, - // 设置自定义下拉刷新下拉时实际下拉位移与用户下拉距离的比值,默认为0.75,即代表若用户下拉10px,则实际位移为7.5px(nvue无效) - refresherPullRate: { - type: Number, - default: u.gc('refresherPullRate', 0.75) - }, - // 是否显示最后更新时间,默认为否 - showRefresherUpdateTime: { - type: Boolean, - default: u.gc('showRefresherUpdateTime', false) - }, - // 如果需要区别不同页面的最后更新时间,请为不同页面的z-paging的`refresher-update-time-key`设置不同的字符串 - refresherUpdateTimeKey: { - type: String, - default: u.gc('refresherUpdateTimeKey', 'default') - }, - // 下拉刷新时下拉到“松手立即刷新”或“松手进入二楼”状态时是否使手机短振动,默认为否(h5无效) - refresherVibrate: { - type: Boolean, - default: u.gc('refresherVibrate', false) - }, - // 下拉刷新时是否禁止下拉刷新view跟随用户触摸竖直移动,默认为否。注意此属性只是禁止下拉刷新view移动,其他下拉刷新逻辑依然会正常触发 - refresherNoTransform: { - type: Boolean, - default: u.gc('refresherNoTransform', false) - }, - // 是否开启下拉刷新状态栏占位,适用于隐藏导航栏时,下拉刷新需要避开状态栏高度的情况,默认为否 - useRefresherStatusBarPlaceholder: { - type: Boolean, - default: u.gc('useRefresherStatusBarPlaceholder', false) - }, - }, - data() { - return { - R: Enum.Refresher, - //下拉刷新状态 - refresherStatus: Enum.Refresher.Default, - refresherTouchstartY: 0, - lastRefresherTouchmove: null, - refresherReachMaxAngle: true, - refresherTransform: 'translateY(0px)', - refresherTransition: '', - finalRefresherDefaultStyle: 'black', - refresherRevealStackCount: 0, - refresherCompleteTimeout: null, - refresherCompleteSubTimeout: null, - refresherEndTimeout: null, - isTouchmovingTimeout: null, - refresherTriggered: false, - isTouchmoving: false, - isTouchEnded: false, - isUserPullDown: false, - privateRefresherEnabled: -1, - privateShowRefresherWhenReload: false, - customRefresherHeight: -1, - showCustomRefresher: false, - doRefreshAnimateAfter: false, - isRefresherInComplete: false, - showF2: false, - f2Transform: '', - pullDownTimeStamp: 0, - moveDis: 0, - oldMoveDis: 0, - currentDis: 0, - oldCurrentMoveDis: 0, - oldRefresherTouchmoveY: 0, - oldTouchDirection: '', - oldEmitedTouchDirection: '', - oldPullingDistance: -1, - refresherThresholdUpdateTag: 0 - } - }, - watch: { - refresherDefaultStyle: { - handler(newVal) { - if (newVal.length) { - this.finalRefresherDefaultStyle = newVal; - } - }, - immediate: true - }, - refresherStatus(newVal) { - newVal === Enum.Refresher.Loading && this._cleanRefresherEndTimeout(); - this.refresherVibrate && (newVal === Enum.Refresher.ReleaseToRefresh || newVal === Enum.Refresher.GoF2) && this._doVibrateShort(); - this.$emit('refresherStatusChange', newVal); - this.$emit('update:refresherStatus', newVal); - }, - // 监听当前下拉刷新启用/禁用状态 - refresherEnabled(newVal) { - // 当禁用下拉刷新时,强制收回正在展示的下拉刷新view - !newVal && this.endRefresh(); - } - }, - computed: { - pullDownDisTimeStamp() { - return 1000 / this.refresherFps; - }, - refresherThresholdUnitConverted() { - return u.addUnit(this.refresherThreshold, this.unit); - }, - finalRefresherEnabled() { - if (this.useChatRecordMode) return false; - if (this.privateRefresherEnabled === -1) return this.refresherEnabled; - return this.privateRefresherEnabled === 1; - }, - finalRefresherThreshold() { - let refresherThreshold = this.refresherThresholdUnitConverted; - let idDefault = false; - if (refresherThreshold === u.addUnit(80, this.unit)) { - idDefault = true; - if (this.showRefresherUpdateTime) { - refresherThreshold = u.addUnit(120, this.unit); - } - } - if (idDefault && this.customRefresherHeight > 0) return this.customRefresherHeight + this.finalRefresherThresholdPlaceholder; - return u.convertToPx(refresherThreshold) + this.finalRefresherThresholdPlaceholder; - }, - finalRefresherF2Threshold() { - return u.convertToPx(u.addUnit(this.refresherF2Threshold, this.unit)); - }, - finalRefresherThresholdPlaceholder() { - return this.useRefresherStatusBarPlaceholder ? this.statusBarHeight : 0; - }, - finalRefresherFixedBacHeight() { - return u.convertToPx(this.refresherFixedBacHeight); - }, - finalRefresherThemeStyle() { - return this.refresherThemeStyle.length ? this.refresherThemeStyle : this.defaultThemeStyle; - }, - finalRefresherOutRate() { - let rate = this.refresherOutRate; - rate = Math.max(0,rate); - rate = Math.min(1,rate); - return rate; - }, - finalRefresherPullRate() { - let rate = this.refresherPullRate; - rate = Math.max(0,rate); - return rate; - }, - finalRefresherTransform() { - if (this.refresherNoTransform || this.refresherTransform === 'translateY(0px)') return 'none'; - return this.refresherTransform; - }, - finalShowRefresherWhenReload() { - return this.showRefresherWhenReload || this.privateShowRefresherWhenReload; - }, - finalRefresherTriggered() { - if (!(this.finalRefresherEnabled && !this.useCustomRefresher)) return false; - return this.refresherTriggered; - }, - showRefresher() { - const showRefresher = this.finalRefresherEnabled && this.useCustomRefresher; - // #ifndef APP-NVUE - this.active && this.customRefresherHeight === -1 && showRefresher && this.updateCustomRefresherHeight(); - // #endif - return showRefresher; - }, - hasTouchmove() { - // #ifdef VUE2 - // #ifdef APP-VUE || H5 - if (this.$listeners && !this.$listeners.refresherTouchmove) return false; - // #endif - // #ifdef MP-WEIXIN || MP-QQ - return this.watchRefresherTouchmove; - // #endif - return true; - // #endif - return this.watchRefresherTouchmove; - }, - }, - methods: { - // 终止下拉刷新状态 - endRefresh() { - this.totalData = this.realTotalData; - this._refresherEnd(); - this._endSystemLoadingAndRefresh(); - this._handleScrollViewBounce({ bounce: true }); - this.$nextTick(() => { - this.refresherTriggered = false; - }) - }, - // 手动更新自定义下拉刷新view高度 - updateCustomRefresherHeight() { - u.delay(() => this.$nextTick(this._updateCustomRefresherHeight)); - }, - // 关闭二楼 - closeF2() { - this._handleCloseF2(); - }, - // 自定义下拉刷新被触发 - _onRefresh(fromScrollView = false, isUserPullDown = true) { - if (fromScrollView && !(this.finalRefresherEnabled && !this.useCustomRefresher)) return; - this.$emit('onRefresh'); - this.$emit('Refresh'); - // #ifdef APP-NVUE - if (this.loading) { - u.delay(this._nRefresherEnd, 500) - return; - } - // #endif - if (this.loading || this.isRefresherInComplete) return; - this.loadingType = Enum.LoadingType.Refresher; - if (this.nShowRefresherReveal) return; - this.isUserPullDown = isUserPullDown; - this.isUserReload = !isUserPullDown; - this._startLoading(true); - this.refresherTriggered = true; - if(this.reloadWhenRefresh && isUserPullDown){ - this.useChatRecordMode ? this._onLoadingMore('click') : this._reload(false, false, isUserPullDown); - } - }, - // 自定义下拉刷新被复位 - _onRestore() { - this.refresherTriggered = 'restore'; - this.$emit('onRestore'); - this.$emit('Restore'); - }, - // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 - // touch开始 - _refresherTouchstart(e) { - this._handleListTouchstart(); - if (this._touchDisabled()) return; - this._handleRefresherTouchstart(u.getTouch(e)); - }, - // #endif - // 进一步处理touch开始结果 - _handleRefresherTouchstart(touch) { - if (!this.loading && this.isTouchEnded) { - this.isTouchmoving = false; - } - this.loadingType = Enum.LoadingType.Refresher; - this.isTouchmovingTimeout && clearTimeout(this.isTouchmovingTimeout); - this.isTouchEnded = false; - this.refresherTransition = ''; - this.refresherTouchstartY = touch.touchY; - this.$emit('refresherTouchstart', this.refresherTouchstartY); - this.lastRefresherTouchmove = touch; - this._cleanRefresherCompleteTimeout(); - this._cleanRefresherEndTimeout(); - }, - - // 非appvue或微信小程序或QQ小程序或h5平台,使用js控制下拉刷新 - // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 - // touch中 - _refresherTouchmove(e) { - const currentTimeStamp = u.getTime(); - let touch = null; - let refresherTouchmoveY = 0; - if (this.watchTouchDirectionChange) { - // 检测下拉刷新方向改变 - touch = u.getTouch(e); - refresherTouchmoveY = touch.touchY; - const direction = refresherTouchmoveY > this.oldRefresherTouchmoveY ? 'top' : 'bottom'; - // 只有在方向改变的时候才emit相关事件 - if (direction === this.oldTouchDirection && direction !== this.oldEmitedTouchDirection) { - this._handleTouchDirectionChange({ direction }); - this.oldEmitedTouchDirection = direction; - } - this.oldTouchDirection = direction; - this.oldRefresherTouchmoveY = refresherTouchmoveY; - } - // 节流处理,在pullDownDisTimeStamp时间内的下拉刷新中事件不进行处理 - if (this.pullDownTimeStamp && currentTimeStamp - this.pullDownTimeStamp <= this.pullDownDisTimeStamp) return; - // 如果不允许下拉,则return - if (this._touchDisabled()) return; - this.pullDownTimeStamp = Number(currentTimeStamp); - touch = u.getTouch(e); - refresherTouchmoveY = touch.touchY; - // 获取当前touch的y - 初始touch的y,计算它们的差 - let moveDis = refresherTouchmoveY - this.refresherTouchstartY; - if (moveDis < 0) return; - // 对下拉刷新的角度进行限制 - if (this.refresherMaxAngle >= 0 && this.refresherMaxAngle <= 90 && this.lastRefresherTouchmove && this.lastRefresherTouchmove.touchY <= refresherTouchmoveY) { - if (!moveDis && !this.refresherAngleEnableChangeContinued && this.moveDis < 1 && !this.refresherReachMaxAngle) return; - const x = Math.abs(touch.touchX - this.lastRefresherTouchmove.touchX); - const y = Math.abs(refresherTouchmoveY - this.lastRefresherTouchmove.touchY); - const z = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); - if ((x || y) && x > 1) { - // 获取下拉刷新前后两次位移的角度 - const angle = Math.asin(y / z) / Math.PI * 180; - // 如果角度小于配置要求,则return - if (angle < this.refresherMaxAngle) { - this.lastRefresherTouchmove = touch; - this.refresherReachMaxAngle = false; - return; - } - } - } - // 获取最终的moveDis - moveDis = this._getFinalRefresherMoveDis(moveDis); - // 处理下拉刷新位移 - this._handleRefresherTouchmove(moveDis, touch); - // 下拉刷新时,禁止页面滚动以防止页面向下滚动和下拉刷新同时作用导致下拉刷新位置偏移超过预期 - if (!this.disabledBounce) { - // #ifndef MP-LARK - this._handleScrollViewBounce({ bounce: false }); - // #endif - this.disabledBounce = true; - } - this._emitTouchmove({ pullingDistance: moveDis, dy: this.moveDis - this.oldMoveDis }); - }, - // #endif - // 进一步处理touch中结果 - _handleRefresherTouchmove(moveDis, touch) { - this.refresherReachMaxAngle = true; - this.isTouchmovingTimeout && clearTimeout(this.isTouchmovingTimeout); - this.isTouchmoving = true; - this.isTouchEnded = false; - // 更新下拉刷新状态 - // 下拉刷新距离超过阈值 - if (moveDis >= this.finalRefresherThreshold) { - // 如果开启了下拉进入二楼并且下拉刷新距离超过进入二楼阈值,则当前下拉刷新状态为松手进入二楼,否则为松手立即刷新 - this.refresherStatus = this.refresherF2Enabled && moveDis >= this.finalRefresherF2Threshold ? Enum.Refresher.GoF2 : Enum.Refresher.ReleaseToRefresh; - } else { - // 下拉刷新距离未超过阈值,显示默认状态 - this.refresherStatus = Enum.Refresher.Default; - } - // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 - // this.scrollEnable = false; - // 通过transform控制下拉刷新view垂直偏移 - this.refresherTransform = `translateY(${moveDis}px)`; - this.lastRefresherTouchmove = touch; - // #endif - this.moveDis = moveDis; - }, - // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 - // touch结束 - _refresherTouchend(e) { - // 下拉刷新用户手离开屏幕,允许列表滚动 - this._handleScrollViewBounce({bounce: true}); - if (this._touchDisabled() || !this.isTouchmoving) return; - const touch = u.getTouch(e); - let refresherTouchendY = touch.touchY; - let moveDis = refresherTouchendY - this.refresherTouchstartY; - moveDis = this._getFinalRefresherMoveDis(moveDis); - this._handleRefresherTouchend(moveDis); - this.disabledBounce = false; - }, - // #endif - // 进一步处理touch结束结果 - _handleRefresherTouchend(moveDis) { - // #ifndef APP-PLUS || H5 || MP-WEIXIN - if (!this.isTouchmoving) return; - // #endif - this.isTouchmovingTimeout && clearTimeout(this.isTouchmovingTimeout); - this.refresherReachMaxAngle = true; - this.isTouchEnded = true; - const refresherThreshold = this.finalRefresherThreshold; - if (moveDis >= refresherThreshold && (this.refresherStatus === Enum.Refresher.ReleaseToRefresh || this.refresherStatus === Enum.Refresher.GoF2)) { - // 如果是松手进入二楼状态,则触发进入二楼 - if (this.refresherStatus === Enum.Refresher.GoF2) { - this._handleGoF2(); - this._refresherEnd(); - } else { - // 如果是松手立即刷新状态,则触发下拉刷新 - // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 - this.refresherTransform = `translateY(${refresherThreshold}px)`; - this.refresherTransition = 'transform .1s linear'; - // #endif - u.delay(() => { - this._emitTouchmove({ pullingDistance: refresherThreshold, dy: this.moveDis - refresherThreshold }); - }, 0.1); - this.moveDis = refresherThreshold; - this.refresherStatus = Enum.Refresher.Loading; - this._doRefresherLoad(); - } - } else { - this._refresherEnd(); - this.isTouchmovingTimeout = u.delay(() => { - this.isTouchmoving = false; - }, this.refresherDefaultDuration); - } - this.scrollEnable = true; - this.$emit('refresherTouchend', moveDis); - }, - // 处理列表触摸开始事件 - _handleListTouchstart() { - if (this.useChatRecordMode && this.autoHideKeyboardWhenChat) { - uni.hideKeyboard(); - this.$emit('hidedKeyboard'); - } - }, - // 处理scroll-view bounce是否生效 - _handleScrollViewBounce({ bounce }) { - if (!this.usePageScroll && !this.scrollToTopBounceEnabled) { - if (this.wxsScrollTop <= 5) { - // #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 - this.refresherTransition = ''; - // #endif - this.scrollEnable = bounce; - } else if (bounce) { - this.scrollEnable = bounce; - } - } - }, - // wxs正在下拉状态改变处理 - _handleWxsPullingDownStatusChange(onPullingDown) { - this.wxsOnPullingDown = onPullingDown; - if (onPullingDown && !this.useChatRecordMode) { - this.renderPropScrollTop = 0; - } - }, - // wxs正在下拉处理 - _handleWxsPullingDown({ moveDis, diffDis }){ - this._emitTouchmove({ pullingDistance: moveDis,dy: diffDis }); - }, - // wxs触摸方向改变 - _handleTouchDirectionChange({ direction }) { - this.$emit('touchDirectionChange',direction); - }, - // wxs通知更新其props - _handlePropUpdate(){ - this.wxsPropType = u.getTime().toString(); - }, - // 下拉刷新结束 - _refresherEnd(shouldEndLoadingDelay = true, fromAddData = false, isUserPullDown = false, setLoading = true) { - if (this.loadingType === Enum.LoadingType.Refresher) { - const refresherCompleteDelay = (fromAddData && (isUserPullDown || this.showRefresherWhenReload)) ? this.refresherCompleteDelay : 0; - const refresherStatus = refresherCompleteDelay > 0 ? Enum.Refresher.Complete : Enum.Refresher.Default; - if (this.finalShowRefresherWhenReload) { - const stackCount = this.refresherRevealStackCount; - this.refresherRevealStackCount --; - if (stackCount > 1) return; - } - this._cleanRefresherEndTimeout(); - this.refresherEndTimeout = u.delay(() => { - this.refresherStatus = refresherStatus; - }, this.refresherStatus !== Enum.Refresher.Default && refresherStatus === Enum.Refresher.Default ? this.refresherCompleteDuration : 0); - - // #ifndef APP-NVUE - if (refresherCompleteDelay > 0) { - this.isRefresherInComplete = true; - } - // #endif - this._cleanRefresherCompleteTimeout(); - this.refresherCompleteTimeout = u.delay(() => { - let animateDuration = 1; - const animateType = this.refresherEndBounceEnabled && fromAddData ? 'cubic-bezier(0.19,1.64,0.42,0.72)' : 'linear'; - if (fromAddData) { - animateDuration = this.refresherEndBounceEnabled ? this.refresherCompleteDuration / 1000 : this.refresherCompleteDuration / 3000; - } - this.refresherTransition = `transform ${fromAddData ? animateDuration : this.refresherDefaultDuration / 1000}s ${animateType}`; - // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 - this.refresherTransform = 'translateY(0px)'; - this.currentDis = 0; - // #endif - // #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 - this.wxsPropType = this.refresherTransition + 'end' + u.getTime(); - // #endif - // #ifdef APP-NVUE - this._nRefresherEnd(); - // #endif - this.moveDis = 0; - // #ifndef APP-NVUE - if (refresherStatus === Enum.Refresher.Complete) { - if (this.refresherCompleteSubTimeout) { - clearTimeout(this.refresherCompleteSubTimeout); - this.refresherCompleteSubTimeout = null; - } - this.refresherCompleteSubTimeout = u.delay(() => { - this.$nextTick(() => { - this.refresherStatus = Enum.Refresher.Default; - this.isRefresherInComplete = false; - }) - }, animateDuration * 800); - } - // #endif - this._emitTouchmove({ pullingDistance: 0, dy: this.moveDis }); - }, refresherCompleteDelay); - } - if (setLoading) { - u.delay(() => this.loading = false, shouldEndLoadingDelay ? 10 : 0); - isUserPullDown && this._onRestore(); - } - }, - // 处理进入二楼 - _handleGoF2() { - if (this.showF2 || !this.refresherF2Enabled) return; - this.$emit('refresherF2Change', 'go'); - - if (!this.showRefresherF2) return; - // #ifndef APP-NVUE - this.f2Transform = `translateY(${-this.superContentHeight}px)`; - this.showF2 = true; - u.delay(() => { - this.f2Transform = 'translateY(0px)'; - }, 100, 'f2ShowDelay') - // #endif - - // #ifdef APP-NVUE - this.showF2 = true; - this.$nextTick(() => { - weexAnimation.transition(this.$refs['zp-n-f2'], { - styles: { transform: `translateY(${-this.superContentHeight}px)` }, - duration: 0, - timingFunction: 'linear', - needLayout: true, - delay: 0 - }) - this.nF2Opacity = 1; - }) - u.delay(() => { - weexAnimation.transition(this.$refs['zp-n-f2'], { - styles: { transform: 'translateY(0px)' }, - duration: this.refresherF2Duration, - timingFunction: 'linear', - needLayout: true, - delay: 0 - }) - }, 10, 'f2GoDelay') - // #endif - }, - // 处理退出二楼 - _handleCloseF2() { - if (!this.showF2 || !this.refresherF2Enabled) return; - this.$emit('refresherF2Change', 'close'); - - if (!this.showRefresherF2) return; - // #ifndef APP-NVUE - this.f2Transform = `translateY(${-this.superContentHeight}px)`; - // #endif - - // #ifdef APP-NVUE - weexAnimation.transition(this.$refs['zp-n-f2'], { - styles: { transform: `translateY(${-this.superContentHeight}px)` }, - duration: this.refresherF2Duration, - timingFunction: 'linear', - needLayout: true, - delay: 0 - }) - // #endif - - u.delay(() => { - this.showF2 = false; - this.nF2Opacity = 0; - }, this.refresherF2Duration, 'f2CloseDelay') - }, - // 模拟用户手动触发下拉刷新 - _doRefresherRefreshAnimate() { - this._cleanRefresherCompleteTimeout(); - // 用户处理用户在短时间内多次调用reload的情况,此时下拉刷新view不需要重复显示,只需要保证最后一次reload对应的请求结束后收回下拉刷新view即可 - // #ifndef APP-NVUE - const doRefreshAnimateAfter = !this.doRefreshAnimateAfter && (this.finalShowRefresherWhenReload) && this - .customRefresherHeight === -1 && this.refresherThreshold === u.addUnit(80, this.unit); - if (doRefreshAnimateAfter) { - this.doRefreshAnimateAfter = true; - return; - } - // #endif - this.refresherRevealStackCount ++; - // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 - this.refresherTransform = `translateY(${this.finalRefresherThreshold}px)`; - // #endif - // #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 - this.wxsPropType = 'begin' + u.getTime(); - // #endif - this.moveDis = this.finalRefresherThreshold; - this.refresherStatus = Enum.Refresher.Loading; - this.isTouchmoving = true; - this.isTouchmovingTimeout && clearTimeout(this.isTouchmovingTimeout); - this._doRefresherLoad(false); - }, - // 触发下拉刷新 - _doRefresherLoad(isUserPullDown = true) { - this._onRefresh(false,isUserPullDown); - this.loading = true; - }, - // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 - // 获取处理后的moveDis - _getFinalRefresherMoveDis(moveDis) { - let diffDis = moveDis - this.oldCurrentMoveDis; - this.oldCurrentMoveDis = moveDis; - if (diffDis > 0) { - // 根据配置的下拉刷新用户手势位移与实际需要的位移比率计算最终的diffDis - diffDis = diffDis * this.finalRefresherPullRate; - if (this.currentDis > this.finalRefresherThreshold) { - diffDis = diffDis * (1 - this.finalRefresherOutRate); - } - } - // 控制diffDis过大的情况,比如进入页面突然猛然下拉,此时diffDis不应进行太大的偏移 - diffDis = diffDis > 100 ? diffDis / 100 : diffDis; - this.currentDis += diffDis; - this.currentDis = Math.max(0, this.currentDis); - return this.currentDis; - }, - // 判断touch手势是否要触发 - _touchDisabled() { - const checkOldScrollTop = this.oldScrollTop > 5; - return this.loading || this.isRefresherInComplete || this.useChatRecordMode || !this.refresherEnabled || !this.useCustomRefresher ||(this.usePageScroll && this.useCustomRefresher && this.pageScrollTop > 10) || (!(this.usePageScroll && this.useCustomRefresher) && checkOldScrollTop); - }, - // #endif - // 更新自定义下拉刷新view高度 - _updateCustomRefresherHeight() { - this._getNodeClientRect('.zp-custom-refresher-slot-view').then((res) => { - this.customRefresherHeight = res ? res[0].height : 0; - this.showCustomRefresher = this.customRefresherHeight > 0; - if (this.doRefreshAnimateAfter) { - this.doRefreshAnimateAfter = false; - this._doRefresherRefreshAnimate(); - } - }); - }, - // emit pullingDown事件 - _emitTouchmove(e) { - // #ifndef APP-NVUE - e.viewHeight = this.finalRefresherThreshold; - // #endif - e.rate = e.viewHeight > 0 ? e.pullingDistance / e.viewHeight : 0; - this.hasTouchmove && this.oldPullingDistance !== e.pullingDistance && this.$emit('refresherTouchmove', e); - this.oldPullingDistance = e.pullingDistance; - }, - // 清除refresherCompleteTimeout - _cleanRefresherCompleteTimeout() { - this.refresherCompleteTimeout = this._cleanTimeout(this.refresherCompleteTimeout); - // #ifdef APP-NVUE - this._nRefresherEnd(false); - // #endif - }, - // 清除refresherEndTimeout - _cleanRefresherEndTimeout() { - this.refresherEndTimeout = this._cleanTimeout(this.refresherEndTimeout); - }, - } -} +// [z-paging]下拉刷新view模块 +import u from '.././z-paging-utils' +import c from '.././z-paging-constant' +import Enum from '.././z-paging-enum' + +// #ifdef APP-NVUE +const weexAnimation = weex.requireModule('animation'); +// #endif +export default { + props: { + // 下拉刷新的主题样式,支持black,white,默认black + refresherThemeStyle: { + type: String, + default: u.gc('refresherThemeStyle', '') + }, + // 自定义下拉刷新中左侧图标的样式 + refresherImgStyle: { + type: Object, + default: u.gc('refresherImgStyle', {}) + }, + // 自定义下拉刷新中右侧状态描述文字的样式 + refresherTitleStyle: { + type: Object, + default: u.gc('refresherTitleStyle', {}) + }, + // 自定义下拉刷新中右侧最后更新时间文字的样式(show-refresher-update-time为true时有效) + refresherUpdateTimeStyle: { + type: Object, + default: u.gc('refresherUpdateTimeStyle', {}) + }, + // 在微信小程序和QQ小程序中,是否实时监听下拉刷新中进度,默认为否 + watchRefresherTouchmove: { + type: Boolean, + default: u.gc('watchRefresherTouchmove', false) + }, + // 底部加载更多的主题样式,支持black,white,默认black + loadingMoreThemeStyle: { + type: String, + default: u.gc('loadingMoreThemeStyle', '') + }, + // 是否只使用下拉刷新,设置为true后将关闭mounted自动请求数据、关闭滚动到底部加载更多,强制隐藏空数据图。默认为否 + refresherOnly: { + type: Boolean, + default: u.gc('refresherOnly', false) + }, + // 自定义下拉刷新默认状态下回弹动画时间,单位为毫秒,默认为100毫秒,nvue无效 + refresherDefaultDuration: { + type: [Number, String], + default: u.gc('refresherDefaultDuration', 100) + }, + // 自定义下拉刷新结束以后延迟回弹的时间,单位为毫秒,默认为0 + refresherCompleteDelay: { + type: [Number, String], + default: u.gc('refresherCompleteDelay', 0) + }, + // 自定义下拉刷新结束回弹动画时间,单位为毫秒,默认为300毫秒(refresherEndBounceEnabled为false时,refresherCompleteDuration为设定值的1/3),nvue无效 + refresherCompleteDuration: { + type: [Number, String], + default: u.gc('refresherCompleteDuration', 300) + }, + // 自定义下拉刷新中是否允许列表滚动,默认为是 + refresherRefreshingScrollable: { + type: Boolean, + default: u.gc('refresherRefreshingScrollable', true) + }, + // 自定义下拉刷新结束状态下是否允许列表滚动,默认为否 + refresherCompleteScrollable: { + type: Boolean, + default: u.gc('refresherCompleteScrollable', false) + }, + // 是否使用自定义的下拉刷新,默认为是,即使用z-paging的下拉刷新。设置为false即代表使用uni scroll-view自带的下拉刷新,h5、App、微信小程序以外的平台不支持uni scroll-view自带的下拉刷新 + useCustomRefresher: { + type: Boolean, + default: u.gc('useCustomRefresher', true) + }, + // 自定义下拉刷新下拉帧率,默认为40,过高可能会出现抖动问题 + refresherFps: { + type: [Number, String], + default: u.gc('refresherFps', 40) + }, + // 自定义下拉刷新允许触发的最大下拉角度,默认为40度,当下拉角度小于设定值时,自定义下拉刷新动画不会被触发 + refresherMaxAngle: { + type: [Number, String], + default: u.gc('refresherMaxAngle', 40) + }, + // 自定义下拉刷新的角度由未达到最大角度变到达到最大角度时,是否继续下拉刷新手势,默认为否 + refresherAngleEnableChangeContinued: { + type: Boolean, + default: u.gc('refresherAngleEnableChangeContinued', false) + }, + // 自定义下拉刷新默认状态下的文字 + refresherDefaultText: { + type: [String, Object], + default: u.gc('refresherDefaultText', null) + }, + // 自定义下拉刷新松手立即刷新状态下的文字 + refresherPullingText: { + type: [String, Object], + default: u.gc('refresherPullingText', null) + }, + // 自定义下拉刷新刷新中状态下的文字 + refresherRefreshingText: { + type: [String, Object], + default: u.gc('refresherRefreshingText', null) + }, + // 自定义下拉刷新刷新结束状态下的文字 + refresherCompleteText: { + type: [String, Object], + default: u.gc('refresherCompleteText', null) + }, + // 自定义继续下拉进入二楼文字 + refresherGoF2Text: { + type: [String, Object], + default: u.gc('refresherGoF2Text', null) + }, + // 自定义下拉刷新默认状态下的图片 + refresherDefaultImg: { + type: String, + default: u.gc('refresherDefaultImg', null) + }, + // 自定义下拉刷新松手立即刷新状态下的图片,默认与refresherDefaultImg一致 + refresherPullingImg: { + type: String, + default: u.gc('refresherPullingImg', null) + }, + // 自定义下拉刷新刷新中状态下的图片 + refresherRefreshingImg: { + type: String, + default: u.gc('refresherRefreshingImg', null) + }, + // 自定义下拉刷新刷新结束状态下的图片 + refresherCompleteImg: { + type: String, + default: u.gc('refresherCompleteImg', null) + }, + // 自定义下拉刷新刷新中状态下是否展示旋转动画 + refresherRefreshingAnimated: { + type: Boolean, + default: u.gc('refresherRefreshingAnimated', true) + }, + // 是否开启自定义下拉刷新刷新结束回弹效果,默认为是 + refresherEndBounceEnabled: { + type: Boolean, + default: u.gc('refresherEndBounceEnabled', true) + }, + // 是否开启自定义下拉刷新,默认为是 + refresherEnabled: { + type: Boolean, + default: u.gc('refresherEnabled', true) + }, + // 设置自定义下拉刷新阈值,默认为80rpx + refresherThreshold: { + type: [Number, String], + default: u.gc('refresherThreshold', '80rpx') + }, + // 设置系统下拉刷新默认样式,支持设置 black,white,none,none 表示不使用默认样式,默认为black + refresherDefaultStyle: { + type: String, + default: u.gc('refresherDefaultStyle', 'black') + }, + // 设置自定义下拉刷新区域背景 + refresherBackground: { + type: String, + default: u.gc('refresherBackground', 'transparent') + }, + // 设置固定的自定义下拉刷新区域背景 + refresherFixedBackground: { + type: String, + default: u.gc('refresherFixedBackground', 'transparent') + }, + // 设置固定的自定义下拉刷新区域高度,默认为0 + refresherFixedBacHeight: { + type: [Number, String], + default: u.gc('refresherFixedBacHeight', 0) + }, + // 设置自定义下拉刷新下拉超出阈值后继续下拉位移衰减的比例,范围0-1,值越大代表衰减越多。默认为0.65(nvue无效) + refresherOutRate: { + type: Number, + default: u.gc('refresherOutRate', 0.65) + }, + // 是否开启下拉进入二楼功能,默认为否 + refresherF2Enabled: { + type: Boolean, + default: u.gc('refresherF2Enabled', false) + }, + // 下拉进入二楼阈值,默认为200rpx + refresherF2Threshold: { + type: [Number, String], + default: u.gc('refresherF2Threshold', '200rpx') + }, + // 下拉进入二楼动画时间,单位为毫秒,默认为200毫秒 + refresherF2Duration: { + type: [Number, String], + default: u.gc('refresherF2Duration', 200) + }, + // 下拉进入二楼状态松手后是否弹出二楼,默认为是 + showRefresherF2: { + type: Boolean, + default: u.gc('showRefresherF2', true) + }, + // 设置自定义下拉刷新下拉时实际下拉位移与用户下拉距离的比值,默认为0.75,即代表若用户下拉10px,则实际位移为7.5px(nvue无效) + refresherPullRate: { + type: Number, + default: u.gc('refresherPullRate', 0.75) + }, + // 是否显示最后更新时间,默认为否 + showRefresherUpdateTime: { + type: Boolean, + default: u.gc('showRefresherUpdateTime', false) + }, + // 如果需要区别不同页面的最后更新时间,请为不同页面的z-paging的`refresher-update-time-key`设置不同的字符串 + refresherUpdateTimeKey: { + type: String, + default: u.gc('refresherUpdateTimeKey', 'default') + }, + // 下拉刷新时下拉到“松手立即刷新”或“松手进入二楼”状态时是否使手机短振动,默认为否(h5无效) + refresherVibrate: { + type: Boolean, + default: u.gc('refresherVibrate', false) + }, + // 下拉刷新时是否禁止下拉刷新view跟随用户触摸竖直移动,默认为否。注意此属性只是禁止下拉刷新view移动,其他下拉刷新逻辑依然会正常触发 + refresherNoTransform: { + type: Boolean, + default: u.gc('refresherNoTransform', false) + }, + // 是否开启下拉刷新状态栏占位,适用于隐藏导航栏时,下拉刷新需要避开状态栏高度的情况,默认为否 + useRefresherStatusBarPlaceholder: { + type: Boolean, + default: u.gc('useRefresherStatusBarPlaceholder', false) + }, + }, + data() { + return { + R: Enum.Refresher, + //下拉刷新状态 + refresherStatus: Enum.Refresher.Default, + refresherTouchstartY: 0, + lastRefresherTouchmove: null, + refresherReachMaxAngle: true, + refresherTransform: 'translateY(0px)', + refresherTransition: '', + finalRefresherDefaultStyle: 'black', + refresherRevealStackCount: 0, + refresherCompleteTimeout: null, + refresherCompleteSubTimeout: null, + refresherEndTimeout: null, + isTouchmovingTimeout: null, + refresherTriggered: false, + isTouchmoving: false, + isTouchEnded: false, + isUserPullDown: false, + privateRefresherEnabled: -1, + privateShowRefresherWhenReload: false, + customRefresherHeight: -1, + showCustomRefresher: false, + doRefreshAnimateAfter: false, + isRefresherInComplete: false, + showF2: false, + f2Transform: '', + pullDownTimeStamp: 0, + moveDis: 0, + oldMoveDis: 0, + currentDis: 0, + oldCurrentMoveDis: 0, + oldRefresherTouchmoveY: 0, + oldTouchDirection: '', + oldEmitedTouchDirection: '', + oldPullingDistance: -1, + refresherThresholdUpdateTag: 0 + } + }, + watch: { + refresherDefaultStyle: { + handler(newVal) { + if (newVal.length) { + this.finalRefresherDefaultStyle = newVal; + } + }, + immediate: true + }, + refresherStatus(newVal) { + newVal === Enum.Refresher.Loading && this._cleanRefresherEndTimeout(); + this.refresherVibrate && (newVal === Enum.Refresher.ReleaseToRefresh || newVal === Enum.Refresher.GoF2) && this._doVibrateShort(); + this.$emit('refresherStatusChange', newVal); + this.$emit('update:refresherStatus', newVal); + }, + // 监听当前下拉刷新启用/禁用状态 + refresherEnabled(newVal) { + // 当禁用下拉刷新时,强制收回正在展示的下拉刷新view + !newVal && this.endRefresh(); + } + }, + computed: { + pullDownDisTimeStamp() { + return 1000 / this.refresherFps; + }, + refresherThresholdUnitConverted() { + return u.addUnit(this.refresherThreshold, this.unit); + }, + finalRefresherEnabled() { + if (this.useChatRecordMode) return false; + if (this.privateRefresherEnabled === -1) return this.refresherEnabled; + return this.privateRefresherEnabled === 1; + }, + finalRefresherThreshold() { + let refresherThreshold = this.refresherThresholdUnitConverted; + let idDefault = false; + if (refresherThreshold === u.addUnit(80, this.unit)) { + idDefault = true; + if (this.showRefresherUpdateTime) { + refresherThreshold = u.addUnit(120, this.unit); + } + } + if (idDefault && this.customRefresherHeight > 0) return this.customRefresherHeight + this.finalRefresherThresholdPlaceholder; + return u.convertToPx(refresherThreshold) + this.finalRefresherThresholdPlaceholder; + }, + finalRefresherF2Threshold() { + return u.convertToPx(u.addUnit(this.refresherF2Threshold, this.unit)); + }, + finalRefresherThresholdPlaceholder() { + return this.useRefresherStatusBarPlaceholder ? this.statusBarHeight : 0; + }, + finalRefresherFixedBacHeight() { + return u.convertToPx(this.refresherFixedBacHeight); + }, + finalRefresherThemeStyle() { + return this.refresherThemeStyle.length ? this.refresherThemeStyle : this.defaultThemeStyle; + }, + finalRefresherOutRate() { + let rate = this.refresherOutRate; + rate = Math.max(0,rate); + rate = Math.min(1,rate); + return rate; + }, + finalRefresherPullRate() { + let rate = this.refresherPullRate; + rate = Math.max(0,rate); + return rate; + }, + finalRefresherTransform() { + if (this.refresherNoTransform || this.refresherTransform === 'translateY(0px)') return 'none'; + return this.refresherTransform; + }, + finalShowRefresherWhenReload() { + return this.showRefresherWhenReload || this.privateShowRefresherWhenReload; + }, + finalRefresherTriggered() { + if (!(this.finalRefresherEnabled && !this.useCustomRefresher)) return false; + return this.refresherTriggered; + }, + showRefresher() { + const showRefresher = this.finalRefresherEnabled && this.useCustomRefresher; + // #ifndef APP-NVUE + this.active && this.customRefresherHeight === -1 && showRefresher && this.updateCustomRefresherHeight(); + // #endif + return showRefresher; + }, + hasTouchmove() { + // #ifdef VUE2 + // #ifdef APP-VUE || H5 + if (this.$listeners && !this.$listeners.refresherTouchmove) return false; + // #endif + // #ifdef MP-WEIXIN || MP-QQ + return this.watchRefresherTouchmove; + // #endif + return true; + // #endif + return this.watchRefresherTouchmove; + }, + }, + methods: { + // 终止下拉刷新状态 + endRefresh() { + this.totalData = this.realTotalData; + this._refresherEnd(); + this._endSystemLoadingAndRefresh(); + this._handleScrollViewBounce({ bounce: true }); + this.$nextTick(() => { + this.refresherTriggered = false; + }) + }, + // 手动更新自定义下拉刷新view高度 + updateCustomRefresherHeight() { + u.delay(() => this.$nextTick(this._updateCustomRefresherHeight)); + }, + // 关闭二楼 + closeF2() { + this._handleCloseF2(); + }, + // 自定义下拉刷新被触发 + _onRefresh(fromScrollView = false, isUserPullDown = true) { + if (fromScrollView && !(this.finalRefresherEnabled && !this.useCustomRefresher)) return; + this.$emit('onRefresh'); + this.$emit('Refresh'); + // #ifdef APP-NVUE + if (this.loading) { + u.delay(this._nRefresherEnd, 500) + return; + } + // #endif + if (this.loading || this.isRefresherInComplete) return; + this.loadingType = Enum.LoadingType.Refresher; + if (this.nShowRefresherReveal) return; + this.isUserPullDown = isUserPullDown; + this.isUserReload = !isUserPullDown; + this._startLoading(true); + this.refresherTriggered = true; + if(this.reloadWhenRefresh && isUserPullDown){ + this.useChatRecordMode ? this._onLoadingMore('click') : this._reload(false, false, isUserPullDown); + } + }, + // 自定义下拉刷新被复位 + _onRestore() { + this.refresherTriggered = 'restore'; + this.$emit('onRestore'); + this.$emit('Restore'); + }, + // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 + // touch开始 + _refresherTouchstart(e) { + this._handleListTouchstart(); + if (this._touchDisabled()) return; + this._handleRefresherTouchstart(u.getTouch(e)); + }, + // #endif + // 进一步处理touch开始结果 + _handleRefresherTouchstart(touch) { + if (!this.loading && this.isTouchEnded) { + this.isTouchmoving = false; + } + this.loadingType = Enum.LoadingType.Refresher; + this.isTouchmovingTimeout && clearTimeout(this.isTouchmovingTimeout); + this.isTouchEnded = false; + this.refresherTransition = ''; + this.refresherTouchstartY = touch.touchY; + this.$emit('refresherTouchstart', this.refresherTouchstartY); + this.lastRefresherTouchmove = touch; + this._cleanRefresherCompleteTimeout(); + this._cleanRefresherEndTimeout(); + }, + + // 非appvue或微信小程序或QQ小程序或h5平台,使用js控制下拉刷新 + // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 + // touch中 + _refresherTouchmove(e) { + const currentTimeStamp = u.getTime(); + let touch = null; + let refresherTouchmoveY = 0; + if (this.watchTouchDirectionChange) { + // 检测下拉刷新方向改变 + touch = u.getTouch(e); + refresherTouchmoveY = touch.touchY; + const direction = refresherTouchmoveY > this.oldRefresherTouchmoveY ? 'top' : 'bottom'; + // 只有在方向改变的时候才emit相关事件 + if (direction === this.oldTouchDirection && direction !== this.oldEmitedTouchDirection) { + this._handleTouchDirectionChange({ direction }); + this.oldEmitedTouchDirection = direction; + } + this.oldTouchDirection = direction; + this.oldRefresherTouchmoveY = refresherTouchmoveY; + } + // 节流处理,在pullDownDisTimeStamp时间内的下拉刷新中事件不进行处理 + if (this.pullDownTimeStamp && currentTimeStamp - this.pullDownTimeStamp <= this.pullDownDisTimeStamp) return; + // 如果不允许下拉,则return + if (this._touchDisabled()) return; + this.pullDownTimeStamp = Number(currentTimeStamp); + touch = u.getTouch(e); + refresherTouchmoveY = touch.touchY; + // 获取当前touch的y - 初始touch的y,计算它们的差 + let moveDis = refresherTouchmoveY - this.refresherTouchstartY; + if (moveDis < 0) return; + // 对下拉刷新的角度进行限制 + if (this.refresherMaxAngle >= 0 && this.refresherMaxAngle <= 90 && this.lastRefresherTouchmove && this.lastRefresherTouchmove.touchY <= refresherTouchmoveY) { + if (!moveDis && !this.refresherAngleEnableChangeContinued && this.moveDis < 1 && !this.refresherReachMaxAngle) return; + const x = Math.abs(touch.touchX - this.lastRefresherTouchmove.touchX); + const y = Math.abs(refresherTouchmoveY - this.lastRefresherTouchmove.touchY); + const z = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); + if ((x || y) && x > 1) { + // 获取下拉刷新前后两次位移的角度 + const angle = Math.asin(y / z) / Math.PI * 180; + // 如果角度小于配置要求,则return + if (angle < this.refresherMaxAngle) { + this.lastRefresherTouchmove = touch; + this.refresherReachMaxAngle = false; + return; + } + } + } + // 获取最终的moveDis + moveDis = this._getFinalRefresherMoveDis(moveDis); + // 处理下拉刷新位移 + this._handleRefresherTouchmove(moveDis, touch); + // 下拉刷新时,禁止页面滚动以防止页面向下滚动和下拉刷新同时作用导致下拉刷新位置偏移超过预期 + if (!this.disabledBounce) { + // #ifndef MP-LARK + this._handleScrollViewBounce({ bounce: false }); + // #endif + this.disabledBounce = true; + } + this._emitTouchmove({ pullingDistance: moveDis, dy: this.moveDis - this.oldMoveDis }); + }, + // #endif + // 进一步处理touch中结果 + _handleRefresherTouchmove(moveDis, touch) { + this.refresherReachMaxAngle = true; + this.isTouchmovingTimeout && clearTimeout(this.isTouchmovingTimeout); + this.isTouchmoving = true; + this.isTouchEnded = false; + // 更新下拉刷新状态 + // 下拉刷新距离超过阈值 + if (moveDis >= this.finalRefresherThreshold) { + // 如果开启了下拉进入二楼并且下拉刷新距离超过进入二楼阈值,则当前下拉刷新状态为松手进入二楼,否则为松手立即刷新 + this.refresherStatus = this.refresherF2Enabled && moveDis >= this.finalRefresherF2Threshold ? Enum.Refresher.GoF2 : Enum.Refresher.ReleaseToRefresh; + } else { + // 下拉刷新距离未超过阈值,显示默认状态 + this.refresherStatus = Enum.Refresher.Default; + } + // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 + // this.scrollEnable = false; + // 通过transform控制下拉刷新view垂直偏移 + this.refresherTransform = `translateY(${moveDis}px)`; + this.lastRefresherTouchmove = touch; + // #endif + this.moveDis = moveDis; + }, + // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 + // touch结束 + _refresherTouchend(e) { + // 下拉刷新用户手离开屏幕,允许列表滚动 + this._handleScrollViewBounce({bounce: true}); + if (this._touchDisabled() || !this.isTouchmoving) return; + const touch = u.getTouch(e); + let refresherTouchendY = touch.touchY; + let moveDis = refresherTouchendY - this.refresherTouchstartY; + moveDis = this._getFinalRefresherMoveDis(moveDis); + this._handleRefresherTouchend(moveDis); + this.disabledBounce = false; + }, + // #endif + // 进一步处理touch结束结果 + _handleRefresherTouchend(moveDis) { + // #ifndef APP-PLUS || H5 || MP-WEIXIN + if (!this.isTouchmoving) return; + // #endif + this.isTouchmovingTimeout && clearTimeout(this.isTouchmovingTimeout); + this.refresherReachMaxAngle = true; + this.isTouchEnded = true; + const refresherThreshold = this.finalRefresherThreshold; + if (moveDis >= refresherThreshold && (this.refresherStatus === Enum.Refresher.ReleaseToRefresh || this.refresherStatus === Enum.Refresher.GoF2)) { + // 如果是松手进入二楼状态,则触发进入二楼 + if (this.refresherStatus === Enum.Refresher.GoF2) { + this._handleGoF2(); + this._refresherEnd(); + } else { + // 如果是松手立即刷新状态,则触发下拉刷新 + // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 + this.refresherTransform = `translateY(${refresherThreshold}px)`; + this.refresherTransition = 'transform .1s linear'; + // #endif + u.delay(() => { + this._emitTouchmove({ pullingDistance: refresherThreshold, dy: this.moveDis - refresherThreshold }); + }, 0.1); + this.moveDis = refresherThreshold; + this.refresherStatus = Enum.Refresher.Loading; + this._doRefresherLoad(); + } + } else { + this._refresherEnd(); + this.isTouchmovingTimeout = u.delay(() => { + this.isTouchmoving = false; + }, this.refresherDefaultDuration); + } + this.scrollEnable = true; + this.$emit('refresherTouchend', moveDis); + }, + // 处理列表触摸开始事件 + _handleListTouchstart() { + if (this.useChatRecordMode && this.autoHideKeyboardWhenChat) { + uni.hideKeyboard(); + this.$emit('hidedKeyboard'); + } + }, + // 处理scroll-view bounce是否生效 + _handleScrollViewBounce({ bounce }) { + if (!this.usePageScroll && !this.scrollToTopBounceEnabled) { + if (this.wxsScrollTop <= 5) { + // #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 + this.refresherTransition = ''; + // #endif + this.scrollEnable = bounce; + } else if (bounce) { + this.scrollEnable = bounce; + } + } + }, + // wxs正在下拉状态改变处理 + _handleWxsPullingDownStatusChange(onPullingDown) { + this.wxsOnPullingDown = onPullingDown; + if (onPullingDown && !this.useChatRecordMode) { + this.renderPropScrollTop = 0; + } + }, + // wxs正在下拉处理 + _handleWxsPullingDown({ moveDis, diffDis }){ + this._emitTouchmove({ pullingDistance: moveDis,dy: diffDis }); + }, + // wxs触摸方向改变 + _handleTouchDirectionChange({ direction }) { + this.$emit('touchDirectionChange',direction); + }, + // wxs通知更新其props + _handlePropUpdate(){ + this.wxsPropType = u.getTime().toString(); + }, + // 下拉刷新结束 + _refresherEnd(shouldEndLoadingDelay = true, fromAddData = false, isUserPullDown = false, setLoading = true) { + if (this.loadingType === Enum.LoadingType.Refresher) { + const refresherCompleteDelay = (fromAddData && (isUserPullDown || this.showRefresherWhenReload)) ? this.refresherCompleteDelay : 0; + const refresherStatus = refresherCompleteDelay > 0 ? Enum.Refresher.Complete : Enum.Refresher.Default; + if (this.finalShowRefresherWhenReload) { + const stackCount = this.refresherRevealStackCount; + this.refresherRevealStackCount --; + if (stackCount > 1) return; + } + this._cleanRefresherEndTimeout(); + this.refresherEndTimeout = u.delay(() => { + this.refresherStatus = refresherStatus; + }, this.refresherStatus !== Enum.Refresher.Default && refresherStatus === Enum.Refresher.Default ? this.refresherCompleteDuration : 0); + + // #ifndef APP-NVUE + if (refresherCompleteDelay > 0) { + this.isRefresherInComplete = true; + } + // #endif + this._cleanRefresherCompleteTimeout(); + this.refresherCompleteTimeout = u.delay(() => { + let animateDuration = 1; + const animateType = this.refresherEndBounceEnabled && fromAddData ? 'cubic-bezier(0.19,1.64,0.42,0.72)' : 'linear'; + if (fromAddData) { + animateDuration = this.refresherEndBounceEnabled ? this.refresherCompleteDuration / 1000 : this.refresherCompleteDuration / 3000; + } + this.refresherTransition = `transform ${fromAddData ? animateDuration : this.refresherDefaultDuration / 1000}s ${animateType}`; + // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 + this.refresherTransform = 'translateY(0px)'; + this.currentDis = 0; + // #endif + // #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 + this.wxsPropType = this.refresherTransition + 'end' + u.getTime(); + // #endif + // #ifdef APP-NVUE + this._nRefresherEnd(); + // #endif + this.moveDis = 0; + // #ifndef APP-NVUE + if (refresherStatus === Enum.Refresher.Complete) { + if (this.refresherCompleteSubTimeout) { + clearTimeout(this.refresherCompleteSubTimeout); + this.refresherCompleteSubTimeout = null; + } + this.refresherCompleteSubTimeout = u.delay(() => { + this.$nextTick(() => { + this.refresherStatus = Enum.Refresher.Default; + this.isRefresherInComplete = false; + }) + }, animateDuration * 800); + } + // #endif + this._emitTouchmove({ pullingDistance: 0, dy: this.moveDis }); + }, refresherCompleteDelay); + } + if (setLoading) { + u.delay(() => this.loading = false, shouldEndLoadingDelay ? 10 : 0); + isUserPullDown && this._onRestore(); + } + }, + // 处理进入二楼 + _handleGoF2() { + if (this.showF2 || !this.refresherF2Enabled) return; + this.$emit('refresherF2Change', 'go'); + + if (!this.showRefresherF2) return; + // #ifndef APP-NVUE + this.f2Transform = `translateY(${-this.superContentHeight}px)`; + this.showF2 = true; + u.delay(() => { + this.f2Transform = 'translateY(0px)'; + }, 100, 'f2ShowDelay') + // #endif + + // #ifdef APP-NVUE + this.showF2 = true; + this.$nextTick(() => { + weexAnimation.transition(this.$refs['zp-n-f2'], { + styles: { transform: `translateY(${-this.superContentHeight}px)` }, + duration: 0, + timingFunction: 'linear', + needLayout: true, + delay: 0 + }) + this.nF2Opacity = 1; + }) + u.delay(() => { + weexAnimation.transition(this.$refs['zp-n-f2'], { + styles: { transform: 'translateY(0px)' }, + duration: this.refresherF2Duration, + timingFunction: 'linear', + needLayout: true, + delay: 0 + }) + }, 10, 'f2GoDelay') + // #endif + }, + // 处理退出二楼 + _handleCloseF2() { + if (!this.showF2 || !this.refresherF2Enabled) return; + this.$emit('refresherF2Change', 'close'); + + if (!this.showRefresherF2) return; + // #ifndef APP-NVUE + this.f2Transform = `translateY(${-this.superContentHeight}px)`; + // #endif + + // #ifdef APP-NVUE + weexAnimation.transition(this.$refs['zp-n-f2'], { + styles: { transform: `translateY(${-this.superContentHeight}px)` }, + duration: this.refresherF2Duration, + timingFunction: 'linear', + needLayout: true, + delay: 0 + }) + // #endif + + u.delay(() => { + this.showF2 = false; + this.nF2Opacity = 0; + }, this.refresherF2Duration, 'f2CloseDelay') + }, + // 模拟用户手动触发下拉刷新 + _doRefresherRefreshAnimate() { + this._cleanRefresherCompleteTimeout(); + // 用户处理用户在短时间内多次调用reload的情况,此时下拉刷新view不需要重复显示,只需要保证最后一次reload对应的请求结束后收回下拉刷新view即可 + // #ifndef APP-NVUE + const doRefreshAnimateAfter = !this.doRefreshAnimateAfter && (this.finalShowRefresherWhenReload) && this + .customRefresherHeight === -1 && this.refresherThreshold === u.addUnit(80, this.unit); + if (doRefreshAnimateAfter) { + this.doRefreshAnimateAfter = true; + return; + } + // #endif + this.refresherRevealStackCount ++; + // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 + this.refresherTransform = `translateY(${this.finalRefresherThreshold}px)`; + // #endif + // #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 + this.wxsPropType = 'begin' + u.getTime(); + // #endif + this.moveDis = this.finalRefresherThreshold; + this.refresherStatus = Enum.Refresher.Loading; + this.isTouchmoving = true; + this.isTouchmovingTimeout && clearTimeout(this.isTouchmovingTimeout); + this._doRefresherLoad(false); + }, + // 触发下拉刷新 + _doRefresherLoad(isUserPullDown = true) { + this._onRefresh(false,isUserPullDown); + this.loading = true; + }, + // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 + // 获取处理后的moveDis + _getFinalRefresherMoveDis(moveDis) { + let diffDis = moveDis - this.oldCurrentMoveDis; + this.oldCurrentMoveDis = moveDis; + if (diffDis > 0) { + // 根据配置的下拉刷新用户手势位移与实际需要的位移比率计算最终的diffDis + diffDis = diffDis * this.finalRefresherPullRate; + if (this.currentDis > this.finalRefresherThreshold) { + diffDis = diffDis * (1 - this.finalRefresherOutRate); + } + } + // 控制diffDis过大的情况,比如进入页面突然猛然下拉,此时diffDis不应进行太大的偏移 + diffDis = diffDis > 100 ? diffDis / 100 : diffDis; + this.currentDis += diffDis; + this.currentDis = Math.max(0, this.currentDis); + return this.currentDis; + }, + // 判断touch手势是否要触发 + _touchDisabled() { + const checkOldScrollTop = this.oldScrollTop > 5; + return this.loading || this.isRefresherInComplete || this.useChatRecordMode || !this.refresherEnabled || !this.useCustomRefresher ||(this.usePageScroll && this.useCustomRefresher && this.pageScrollTop > 10) || (!(this.usePageScroll && this.useCustomRefresher) && checkOldScrollTop); + }, + // #endif + // 更新自定义下拉刷新view高度 + _updateCustomRefresherHeight() { + this._getNodeClientRect('.zp-custom-refresher-slot-view').then((res) => { + this.customRefresherHeight = res ? res[0].height : 0; + this.showCustomRefresher = this.customRefresherHeight > 0; + if (this.doRefreshAnimateAfter) { + this.doRefreshAnimateAfter = false; + this._doRefresherRefreshAnimate(); + } + }); + }, + // emit pullingDown事件 + _emitTouchmove(e) { + // #ifndef APP-NVUE + e.viewHeight = this.finalRefresherThreshold; + // #endif + e.rate = e.viewHeight > 0 ? e.pullingDistance / e.viewHeight : 0; + this.hasTouchmove && this.oldPullingDistance !== e.pullingDistance && this.$emit('refresherTouchmove', e); + this.oldPullingDistance = e.pullingDistance; + }, + // 清除refresherCompleteTimeout + _cleanRefresherCompleteTimeout() { + this.refresherCompleteTimeout = this._cleanTimeout(this.refresherCompleteTimeout); + // #ifdef APP-NVUE + this._nRefresherEnd(false); + // #endif + }, + // 清除refresherEndTimeout + _cleanRefresherEndTimeout() { + this.refresherEndTimeout = this._cleanTimeout(this.refresherEndTimeout); + }, + } +} diff --git a/uni_modules/z-paging/components/z-paging/js/modules/scroller.js b/uni_modules/z-paging/components/z-paging/js/modules/scroller.js index c44180a1..49141c09 100644 --- a/uni_modules/z-paging/components/z-paging/js/modules/scroller.js +++ b/uni_modules/z-paging/components/z-paging/js/modules/scroller.js @@ -1,518 +1,518 @@ -// [z-paging]scroll相关模块 -import u from '.././z-paging-utils' -import Enum from '.././z-paging-enum' - -// #ifdef APP-NVUE -const weexDom = weex.requireModule('dom'); -// #endif - -export default { - props: { - // 使用页面滚动,默认为否,当设置为是时则使用页面的滚动而非此组件内部的scroll-view的滚动,使用页面滚动时z-paging无需设置确定的高度且对于长列表展示性能更高,但配置会略微繁琐 - usePageScroll: { - type: Boolean, - default: u.gc('usePageScroll', false) - }, - // 是否可以滚动,使用内置scroll-view和nvue时有效,默认为是 - scrollable: { - type: Boolean, - default: u.gc('scrollable', true) - }, - // 控制是否出现滚动条,默认为是 - showScrollbar: { - type: Boolean, - default: u.gc('showScrollbar', true) - }, - // 是否允许横向滚动,默认为否 - scrollX: { - type: Boolean, - default: u.gc('scrollX', false) - }, - // iOS设备上滚动到顶部时是否允许回弹效果,默认为否。关闭回弹效果后可使滚动到顶部与下拉刷新更连贯,但是有吸顶view时滚动到顶部时可能出现抖动。 - scrollToTopBounceEnabled: { - type: Boolean, - default: u.gc('scrollToTopBounceEnabled', false) - }, - // iOS设备上滚动到底部时是否允许回弹效果,默认为是。 - scrollToBottomBounceEnabled: { - type: Boolean, - default: u.gc('scrollToBottomBounceEnabled', true) - }, - // 在设置滚动条位置时使用动画过渡,默认为否 - scrollWithAnimation: { - type: Boolean, - default: u.gc('scrollWithAnimation', false) - }, - // 值应为某子元素id(id不能以数字开头)。设置哪个方向可滚动,则在哪个方向滚动到该元素 - scrollIntoView: { - type: String, - default: u.gc('scrollIntoView', '') - }, - }, - data() { - return { - scrollTop: 0, - oldScrollTop: 0, - scrollViewStyle: {}, - scrollViewContainerStyle: {}, - scrollViewInStyle: {}, - pageScrollTop: -1, - scrollEnable: true, - privateScrollWithAnimation: -1, - cacheScrollNodeHeight: -1, - superContentHeight: 0, - } - }, - watch: { - oldScrollTop(newVal) { - !this.usePageScroll && this._scrollTopChange(newVal,false); - }, - pageScrollTop(newVal) { - this.usePageScroll && this._scrollTopChange(newVal,true); - }, - usePageScroll: { - handler(newVal) { - this.loaded && this.autoHeight && this._setAutoHeight(!newVal); - // #ifdef H5 - if (newVal) { - this.$nextTick(() => { - const mainScrollRef = this.$refs['zp-scroll-view'].$refs.main; - if (mainScrollRef) { - mainScrollRef.style = {}; - } - }) - } - // #endif - }, - immediate: true - }, - finalScrollTop(newVal) { - this.renderPropScrollTop = newVal < 6 ? 0 : 10; - } - }, - computed: { - finalScrollWithAnimation() { - if (this.privateScrollWithAnimation !== -1) { - return this.privateScrollWithAnimation === 1; - } - return this.scrollWithAnimation; - }, - finalScrollViewStyle() { - if (this.superContentZIndex != 1) { - this.scrollViewStyle['z-index'] = this.superContentZIndex; - this.scrollViewStyle['position'] = 'relative'; - } - return this.scrollViewStyle; - }, - finalScrollTop() { - return this.usePageScroll ? this.pageScrollTop : this.oldScrollTop; - }, - // 当前是否是旧版webview - finalIsOldWebView() { - return this.isOldWebView && !this.usePageScroll; - }, - // 当前scroll-view/list-view是否允许滚动 - finalScrollable() { - return this.scrollable && !this.usePageScroll && this.scrollEnable - && (this.refresherCompleteScrollable ? true : this.refresherStatus !== Enum.Refresher.Complete) - && (this.refresherRefreshingScrollable ? true : this.refresherStatus !== Enum.Refresher.Loading); - } - }, - methods: { - // 滚动到顶部,animate为是否展示滚动动画,默认为是 - scrollToTop(animate, checkReverse = true) { - // 如果是聊天记录模式并且列表倒置了,则滚动到顶部实际上是滚动到底部 - if (this.useChatRecordMode && checkReverse && !this.isChatRecordModeAndNotInversion) { - this.scrollToBottom(animate, false); - return; - } - this.$nextTick(() => { - this._scrollToTop(animate, false); - // #ifdef APP-NVUE - if (this.nvueFastScroll && animate) { - u.delay(() => { - this._scrollToTop(false, false); - }); - } - // #endif - }) - }, - // 滚动到底部,animate为是否展示滚动动画,默认为是 - scrollToBottom(animate, checkReverse = true) { - // 如果是聊天记录模式并且列表倒置了,则滚动到底部实际上是滚动到顶部 - if (this.useChatRecordMode && checkReverse && !this.isChatRecordModeAndNotInversion) { - this.scrollToTop(animate, false); - return; - } - this.$nextTick(() => { - this._scrollToBottom(animate); - // #ifdef APP-NVUE - if (this.nvueFastScroll && animate) { - u.delay(() => { - this._scrollToBottom(false); - }); - } - // #endif - }) - }, - // 滚动到指定view(vue中有效)。sel为需要滚动的view的id值,不包含"#";offset为偏移量,单位为px;animate为是否展示滚动动画,默认为否 - scrollIntoViewById(sel, offset, animate) { - this._scrollIntoView(sel, offset, animate); - }, - // 滚动到指定view(vue中有效)。nodeTop为需要滚动的view的top值(通过uni.createSelectorQuery()获取);offset为偏移量,单位为px;animate为是否展示滚动动画,默认为否 - scrollIntoViewByNodeTop(nodeTop, offset, animate) { - this.scrollTop = this.oldScrollTop; - this.$nextTick(() => { - this._scrollIntoViewByNodeTop(nodeTop, offset, animate); - }) - }, - // 滚动到指定位置(vue中有效)。y为与顶部的距离,单位为px;offset为偏移量,单位为px;animate为是否展示滚动动画,默认为否 - scrollToY(y, offset, animate) { - this.scrollTop = this.oldScrollTop; - this.$nextTick(() => { - this._scrollToY(y, offset, animate); - }) - }, - // 滚动到指定view(nvue中和虚拟列表中有效)。index为需要滚动的view的index(第几个,从0开始);offset为偏移量,单位为px;animate为是否展示滚动动画,默认为否 - scrollIntoViewByIndex(index, offset, animate) { - if (index >= this.realTotalData.length) { - u.consoleErr('当前滚动的index超出已渲染列表长度,请先通过refreshToPage加载到对应index页并等待渲染成功后再调用此方法!') - return; - } - this.$nextTick(() => { - // #ifdef APP-NVUE - // 在nvue中,根据index获取对应节点信息并滚动到此节点位置 - this._scrollIntoView(index, offset, animate); - // #endif - // #ifndef APP-NVUE - if (this.finalUseVirtualList) { - const isCellFixed = this.cellHeightMode === Enum.CellHeightMode.Fixed; - u.delay(() => { - if (this.finalUseVirtualList) { - // 虚拟列表 + 每个cell高度完全相同模式下,此时滚动到对应index的cell就是滚动到scrollTop = cellHeight * index的位置 - // 虚拟列表 + 高度是动态非固定的模式下,此时滚动到对应index的cell就是滚动到scrollTop = 缓存的cell高度数组中第index个的lastTotalHeight的位置 - const scrollTop = isCellFixed ? this.virtualCellHeight * index : this.virtualHeightCacheList[index].lastTotalHeight; - this.scrollToY(scrollTop, offset, animate); - } - }, isCellFixed ? 0 : 100) - } - // #endif - }) - }, - // 滚动到指定view(nvue中有效)。view为需要滚动的view(通过`this.$refs.xxx`获取),不包含"#";offset为偏移量,单位为px;animate为是否展示滚动动画,默认为否 - scrollIntoViewByView(view, offset, animate) { - this._scrollIntoView(view, offset, animate); - }, - // 当使用页面滚动并且自定义下拉刷新时,请在页面的onPageScroll中调用此方法,告知z-paging当前的pageScrollTop,否则会导致在任意位置都可以下拉刷新 - updatePageScrollTop(value) { - this.pageScrollTop = value; - }, - // 当使用页面滚动并且设置了slot="top"时,默认初次加载会自动获取其高度,并使内部容器下移,当slot="top"的view高度动态改变时,在其高度需要更新时调用此方法 - updatePageScrollTopHeight() { - this._updatePageScrollTopOrBottomHeight('top'); - }, - // 当使用页面滚动并且设置了slot="bottom"时,默认初次加载会自动获取其高度,并使内部容器下移,当slot="bottom"的view高度动态改变时,在其高度需要更新时调用此方法 - updatePageScrollBottomHeight() { - this._updatePageScrollTopOrBottomHeight('bottom'); - }, - // 更新slot="left"和slot="right"宽度,当slot="left"或slot="right"宽度动态改变时调用 - updateLeftAndRightWidth() { - if (!this.finalIsOldWebView) return; - this.$nextTick(() => this._updateLeftAndRightWidth(this.scrollViewContainerStyle, 'zp-page')); - }, - // 更新z-paging内置scroll-view的scrollTop - updateScrollViewScrollTop(scrollTop, animate = true) { - this._updatePrivateScrollWithAnimation(animate); - this.scrollTop = this.oldScrollTop; - this.$nextTick(() => { - this.scrollTop = scrollTop; - this.oldScrollTop = this.scrollTop; - }); - }, - - // 当滚动到顶部时 - _onScrollToUpper() { - this.$emit('scrolltoupper'); - this.$emit('scrollTopChange', 0); - this.$nextTick(() => { - this.oldScrollTop = 0; - }) - }, - // 当滚动到底部时 - _onScrollToLower(e) { - (!e.detail || !e.detail.direction || e.detail.direction === 'bottom') && this._onLoadingMore(this.useChatRecordMode ? 'click' : 'toBottom') - }, - // 滚动到顶部 - _scrollToTop(animate = true, isPrivate = true) { - // #ifdef APP-NVUE - // 在nvue中需要通过weex.scrollToElement滚动到顶部,此时在顶部插入了一个view,使得滚动到这个view位置 - const el = this.$refs['zp-n-list-top-tag']; - if (this.usePageScroll) { - this._getNodeClientRect('zp-page-scroll-top', false).then(node => { - const nodeHeight = node ? node[0].height : 0; - weexDom.scrollToElement(el, { - offset: -nodeHeight, - animated: animate - }); - }); - } else { - if (!this.isIos && this.nvueListIs === 'scroller') { - this._getNodeClientRect('zp-n-refresh-container', false).then(node => { - const nodeHeight = node ? node[0].height : 0; - weexDom.scrollToElement(el, { - offset: -nodeHeight, - animated: animate - }); - }); - } else { - weexDom.scrollToElement(el, { - offset: 0, - animated: animate - }); - } - } - return; - // #endif - if (this.usePageScroll) { - this.$nextTick(() => { - uni.pageScrollTo({ - scrollTop: 0, - duration: animate ? 100 : 0, - }); - }); - return; - } - this._updatePrivateScrollWithAnimation(animate); - this.scrollTop = this.oldScrollTop; - this.$nextTick(() => { - this.scrollTop = 0; - this.oldScrollTop = this.scrollTop; - }); - }, - // 滚动到底部 - async _scrollToBottom(animate = true) { - // #ifdef APP-NVUE - // 在nvue中需要通过weex.scrollToElement滚动到顶部,此时在底部插入了一个view,使得滚动到这个view位置 - const el = this.$refs['zp-n-list-bottom-tag']; - if (el) { - weexDom.scrollToElement(el, { - offset: 0, - animated: animate - }); - } else { - u.consoleErr('滚动到底部失败,因为您设置了hideNvueBottomTag为true'); - } - return; - // #endif - if (this.usePageScroll) { - this.$nextTick(() => { - uni.pageScrollTo({ - scrollTop: Number.MAX_VALUE, - duration: animate ? 100 : 0, - }); - }); - return; - } - try { - this._updatePrivateScrollWithAnimation(animate); - const pagingContainerNode = await this._getNodeClientRect('.zp-paging-container'); - const scrollViewNode = await this._getNodeClientRect('.zp-scroll-view'); - const pagingContainerH = pagingContainerNode ? pagingContainerNode[0].height : 0; - const scrollViewH = scrollViewNode ? scrollViewNode[0].height : 0; - if (pagingContainerH > scrollViewH) { - this.scrollTop = this.oldScrollTop; - this.$nextTick(() => { - this.scrollTop = pagingContainerH - scrollViewH + this.virtualPlaceholderTopHeight; - this.oldScrollTop = this.scrollTop; - }); - } - } catch (e) {} - }, - // 滚动到指定view - _scrollIntoView(sel, offset = 0, animate = false, finishCallback) { - try { - this.scrollTop = this.oldScrollTop; - this.$nextTick(() => { - // #ifdef APP-NVUE - const refs = this.$parent.$refs; - if (!refs) return; - const dataType = Object.prototype.toString.call(sel); - let el = null; - if (dataType === '[object Number]') { - const els = refs[`z-paging-${sel}`]; - el = els ? els[0] : null; - } else if (dataType === '[object Array]') { - el = sel[0]; - } else { - el = sel; - } - if (el) { - weexDom.scrollToElement(el, { - offset: -offset, - animated: animate - }); - } else { - u.consoleErr('在nvue中滚动到指定位置,cell必须设置 :ref="`z-paging-${index}`"'); - } - return; - // #endif - this._getNodeClientRect('#' + sel.replace('#', ''), this.$parent).then((node) => { - if (node) { - let nodeTop = node[0].top; - this._scrollIntoViewByNodeTop(nodeTop, offset, animate); - finishCallback && finishCallback(); - } - }); - }); - } catch (e) {} - }, - // 通过nodeTop滚动到指定view - _scrollIntoViewByNodeTop(nodeTop, offset = 0, animate = false) { - // 如果是聊天记录模式并且列表倒置了,此时nodeTop需要等于scroll-view高度 - nodeTop - if (this.isChatRecordModeAndInversion) { - this._getNodeClientRect('.zp-scroll-view').then(sNode => { - if (sNode) { - this._scrollToY(sNode[0].height - nodeTop, offset, animate, true); - } - }) - } else { - this._scrollToY(nodeTop, offset, animate, true); - } - }, - // 滚动到指定位置 - _scrollToY(y, offset = 0, animate = false, addScrollTop = false) { - this._updatePrivateScrollWithAnimation(animate); - u.delay(() => { - if (this.usePageScroll) { - if (addScrollTop && this.pageScrollTop !== -1) { - y += this.pageScrollTop; - } - const scrollTop = y - offset; - uni.pageScrollTo({ - scrollTop, - duration: animate ? 100 : 0 - }); - } else { - if (addScrollTop) { - y += this.oldScrollTop; - } - this.scrollTop = y - offset; - } - }, 10) - }, - // scroll-view滚动中 - _scroll(e) { - this.$emit('scroll', e); - const scrollTop = e.detail.scrollTop; - // #ifndef APP-NVUE - this.finalUseVirtualList && this._updateVirtualScroll(scrollTop, this.oldScrollTop - scrollTop); - // #endif - this.oldScrollTop = scrollTop; - // 滚动区域内容的总高度 - 当前滚动的scrollTop = 当前滚动区域的顶部与内容底部的距离 - const scrollDiff = e.detail.scrollHeight - this.oldScrollTop; - // 在非ios平台滚动中,再次验证一下是否滚动到了底部。因为在一些安卓设备中,有概率滚动到底部不触发@scrolltolower事件,因此添加双重检测逻辑 - !this.isIos && this._checkScrolledToBottom(scrollDiff); - }, - // 更新内置的scroll-view是否启用滚动动画 - _updatePrivateScrollWithAnimation(animate) { - this.privateScrollWithAnimation = animate ? 1 : 0; - u.delay(() => this.$nextTick(() => { - // 在滚动结束后将滚动动画状态设置回初始状态 - this.privateScrollWithAnimation = -1; - }), 100, 'updateScrollWithAnimationDelay') - }, - // 检测scrollView是否要铺满屏幕 - _doCheckScrollViewShouldFullHeight(totalData) { - if (this.autoFullHeight && this.usePageScroll && this.isTotalChangeFromAddData) { - // #ifndef APP-NVUE - this.$nextTick(() => { - this._checkScrollViewShouldFullHeight((scrollViewNode, pagingContainerNode) => { - this._preCheckShowNoMoreInside(totalData, scrollViewNode, pagingContainerNode) - }); - }) - // #endif - // #ifdef APP-NVUE - this._preCheckShowNoMoreInside(totalData) - // #endif - } else { - this._preCheckShowNoMoreInside(totalData) - } - }, - // 检测z-paging是否要全屏覆盖(当使用页面滚动并且不满全屏时,默认z-paging需要铺满全屏,避免数据过少时内部的empty-view无法正确展示) - async _checkScrollViewShouldFullHeight(callback) { - try { - const scrollViewNode = await this._getNodeClientRect('.zp-scroll-view'); - const pagingContainerNode = await this._getNodeClientRect('.zp-paging-container-content'); - if (!scrollViewNode || !pagingContainerNode) return; - const scrollViewHeight = pagingContainerNode[0].height; - const scrollViewTop = scrollViewNode[0].top; - if (this.isAddedData && scrollViewHeight + scrollViewTop <= this.windowHeight) { - this._setAutoHeight(true, scrollViewNode); - callback(scrollViewNode, pagingContainerNode); - } else { - this._setAutoHeight(false); - callback(null, null); - } - } catch (e) { - callback(null, null); - } - }, - // 更新缓存中z-paging整个内容容器高度 - async _updateCachedSuperContentHeight() { - const superContentNode = await this._getNodeClientRect('.z-paging-content'); - if (superContentNode) { - this.superContentHeight = superContentNode[0].height; - } - }, - // scrollTop改变时触发 - _scrollTopChange(newVal, isPageScrollTop){ - this.$emit('scrollTopChange', newVal); - this.$emit('update:scrollTop', newVal); - this._checkShouldShowBackToTop(newVal); - // 之前在安卓中scroll-view有概率滚动到顶部时scrollTop不为0导致下拉刷新判断异常,因此判断scrollTop在105之内都允许下拉刷新,但此方案会导致某些情况(例如滚动到距离顶部10px处)下拉抖动,因此改为通过获取zp-scroll-view的节点信息中的scrollTop进行验证的方案 - // const scrollTop = this.isIos ? (newVal > 5 ? 6 : 0) : (newVal > 105 ? 106 : (newVal > 5 ? 6 : 0)); - const scrollTop = newVal > 5 ? 6 : 0; - if (isPageScrollTop && this.wxsPageScrollTop !== scrollTop) { - this.wxsPageScrollTop = scrollTop; - } else if (!isPageScrollTop && this.wxsScrollTop !== scrollTop) { - this.wxsScrollTop = scrollTop; - if (scrollTop > 6) { - this.scrollEnable = true; - } - } - }, - // 更新使用页面滚动时slot="top"或"bottom"插入view的高度 - _updatePageScrollTopOrBottomHeight(type) { - // #ifndef APP-NVUE - if (!this.usePageScroll) return; - // #endif - this._doCheckScrollViewShouldFullHeight(this.realTotalData); - const node = `.zp-page-${type}`; - const marginText = `margin${type.slice(0,1).toUpperCase() + type.slice(1)}`; - let safeAreaInsetBottomAdd = this.safeAreaInsetBottom; - this.$nextTick(() => { - let delayTime = 0; - // #ifdef MP-BAIDU || APP-NVUE - delayTime = 50; - // #endif - u.delay(() => { - this._getNodeClientRect(node).then((res) => { - if (res) { - let pageScrollNodeHeight = res[0].height; - if (type === 'bottom') { - if (safeAreaInsetBottomAdd) { - pageScrollNodeHeight += this.safeAreaBottom; - } - } else { - this.cacheTopHeight = pageScrollNodeHeight; - } - this.$set(this.scrollViewStyle, marginText, `${pageScrollNodeHeight}px`); - } else if (safeAreaInsetBottomAdd) { - this.$set(this.scrollViewStyle, marginText, `${this.safeAreaBottom}px`); - } - }); - }, delayTime) - }) - }, - } -} +// [z-paging]scroll相关模块 +import u from '.././z-paging-utils' +import Enum from '.././z-paging-enum' + +// #ifdef APP-NVUE +const weexDom = weex.requireModule('dom'); +// #endif + +export default { + props: { + // 使用页面滚动,默认为否,当设置为是时则使用页面的滚动而非此组件内部的scroll-view的滚动,使用页面滚动时z-paging无需设置确定的高度且对于长列表展示性能更高,但配置会略微繁琐 + usePageScroll: { + type: Boolean, + default: u.gc('usePageScroll', false) + }, + // 是否可以滚动,使用内置scroll-view和nvue时有效,默认为是 + scrollable: { + type: Boolean, + default: u.gc('scrollable', true) + }, + // 控制是否出现滚动条,默认为是 + showScrollbar: { + type: Boolean, + default: u.gc('showScrollbar', true) + }, + // 是否允许横向滚动,默认为否 + scrollX: { + type: Boolean, + default: u.gc('scrollX', false) + }, + // iOS设备上滚动到顶部时是否允许回弹效果,默认为否。关闭回弹效果后可使滚动到顶部与下拉刷新更连贯,但是有吸顶view时滚动到顶部时可能出现抖动。 + scrollToTopBounceEnabled: { + type: Boolean, + default: u.gc('scrollToTopBounceEnabled', false) + }, + // iOS设备上滚动到底部时是否允许回弹效果,默认为是。 + scrollToBottomBounceEnabled: { + type: Boolean, + default: u.gc('scrollToBottomBounceEnabled', true) + }, + // 在设置滚动条位置时使用动画过渡,默认为否 + scrollWithAnimation: { + type: Boolean, + default: u.gc('scrollWithAnimation', false) + }, + // 值应为某子元素id(id不能以数字开头)。设置哪个方向可滚动,则在哪个方向滚动到该元素 + scrollIntoView: { + type: String, + default: u.gc('scrollIntoView', '') + }, + }, + data() { + return { + scrollTop: 0, + oldScrollTop: 0, + scrollViewStyle: {}, + scrollViewContainerStyle: {}, + scrollViewInStyle: {}, + pageScrollTop: -1, + scrollEnable: true, + privateScrollWithAnimation: -1, + cacheScrollNodeHeight: -1, + superContentHeight: 0, + } + }, + watch: { + oldScrollTop(newVal) { + !this.usePageScroll && this._scrollTopChange(newVal,false); + }, + pageScrollTop(newVal) { + this.usePageScroll && this._scrollTopChange(newVal,true); + }, + usePageScroll: { + handler(newVal) { + this.loaded && this.autoHeight && this._setAutoHeight(!newVal); + // #ifdef H5 + if (newVal) { + this.$nextTick(() => { + const mainScrollRef = this.$refs['zp-scroll-view'].$refs.main; + if (mainScrollRef) { + mainScrollRef.style = {}; + } + }) + } + // #endif + }, + immediate: true + }, + finalScrollTop(newVal) { + this.renderPropScrollTop = newVal < 6 ? 0 : 10; + } + }, + computed: { + finalScrollWithAnimation() { + if (this.privateScrollWithAnimation !== -1) { + return this.privateScrollWithAnimation === 1; + } + return this.scrollWithAnimation; + }, + finalScrollViewStyle() { + if (this.superContentZIndex != 1) { + this.scrollViewStyle['z-index'] = this.superContentZIndex; + this.scrollViewStyle['position'] = 'relative'; + } + return this.scrollViewStyle; + }, + finalScrollTop() { + return this.usePageScroll ? this.pageScrollTop : this.oldScrollTop; + }, + // 当前是否是旧版webview + finalIsOldWebView() { + return this.isOldWebView && !this.usePageScroll; + }, + // 当前scroll-view/list-view是否允许滚动 + finalScrollable() { + return this.scrollable && !this.usePageScroll && this.scrollEnable + && (this.refresherCompleteScrollable ? true : this.refresherStatus !== Enum.Refresher.Complete) + && (this.refresherRefreshingScrollable ? true : this.refresherStatus !== Enum.Refresher.Loading); + } + }, + methods: { + // 滚动到顶部,animate为是否展示滚动动画,默认为是 + scrollToTop(animate, checkReverse = true) { + // 如果是聊天记录模式并且列表倒置了,则滚动到顶部实际上是滚动到底部 + if (this.useChatRecordMode && checkReverse && !this.isChatRecordModeAndNotInversion) { + this.scrollToBottom(animate, false); + return; + } + this.$nextTick(() => { + this._scrollToTop(animate, false); + // #ifdef APP-NVUE + if (this.nvueFastScroll && animate) { + u.delay(() => { + this._scrollToTop(false, false); + }); + } + // #endif + }) + }, + // 滚动到底部,animate为是否展示滚动动画,默认为是 + scrollToBottom(animate, checkReverse = true) { + // 如果是聊天记录模式并且列表倒置了,则滚动到底部实际上是滚动到顶部 + if (this.useChatRecordMode && checkReverse && !this.isChatRecordModeAndNotInversion) { + this.scrollToTop(animate, false); + return; + } + this.$nextTick(() => { + this._scrollToBottom(animate); + // #ifdef APP-NVUE + if (this.nvueFastScroll && animate) { + u.delay(() => { + this._scrollToBottom(false); + }); + } + // #endif + }) + }, + // 滚动到指定view(vue中有效)。sel为需要滚动的view的id值,不包含"#";offset为偏移量,单位为px;animate为是否展示滚动动画,默认为否 + scrollIntoViewById(sel, offset, animate) { + this._scrollIntoView(sel, offset, animate); + }, + // 滚动到指定view(vue中有效)。nodeTop为需要滚动的view的top值(通过uni.createSelectorQuery()获取);offset为偏移量,单位为px;animate为是否展示滚动动画,默认为否 + scrollIntoViewByNodeTop(nodeTop, offset, animate) { + this.scrollTop = this.oldScrollTop; + this.$nextTick(() => { + this._scrollIntoViewByNodeTop(nodeTop, offset, animate); + }) + }, + // 滚动到指定位置(vue中有效)。y为与顶部的距离,单位为px;offset为偏移量,单位为px;animate为是否展示滚动动画,默认为否 + scrollToY(y, offset, animate) { + this.scrollTop = this.oldScrollTop; + this.$nextTick(() => { + this._scrollToY(y, offset, animate); + }) + }, + // 滚动到指定view(nvue中和虚拟列表中有效)。index为需要滚动的view的index(第几个,从0开始);offset为偏移量,单位为px;animate为是否展示滚动动画,默认为否 + scrollIntoViewByIndex(index, offset, animate) { + if (index >= this.realTotalData.length) { + u.consoleErr('当前滚动的index超出已渲染列表长度,请先通过refreshToPage加载到对应index页并等待渲染成功后再调用此方法!') + return; + } + this.$nextTick(() => { + // #ifdef APP-NVUE + // 在nvue中,根据index获取对应节点信息并滚动到此节点位置 + this._scrollIntoView(index, offset, animate); + // #endif + // #ifndef APP-NVUE + if (this.finalUseVirtualList) { + const isCellFixed = this.cellHeightMode === Enum.CellHeightMode.Fixed; + u.delay(() => { + if (this.finalUseVirtualList) { + // 虚拟列表 + 每个cell高度完全相同模式下,此时滚动到对应index的cell就是滚动到scrollTop = cellHeight * index的位置 + // 虚拟列表 + 高度是动态非固定的模式下,此时滚动到对应index的cell就是滚动到scrollTop = 缓存的cell高度数组中第index个的lastTotalHeight的位置 + const scrollTop = isCellFixed ? this.virtualCellHeight * index : this.virtualHeightCacheList[index].lastTotalHeight; + this.scrollToY(scrollTop, offset, animate); + } + }, isCellFixed ? 0 : 100) + } + // #endif + }) + }, + // 滚动到指定view(nvue中有效)。view为需要滚动的view(通过`this.$refs.xxx`获取),不包含"#";offset为偏移量,单位为px;animate为是否展示滚动动画,默认为否 + scrollIntoViewByView(view, offset, animate) { + this._scrollIntoView(view, offset, animate); + }, + // 当使用页面滚动并且自定义下拉刷新时,请在页面的onPageScroll中调用此方法,告知z-paging当前的pageScrollTop,否则会导致在任意位置都可以下拉刷新 + updatePageScrollTop(value) { + this.pageScrollTop = value; + }, + // 当使用页面滚动并且设置了slot="top"时,默认初次加载会自动获取其高度,并使内部容器下移,当slot="top"的view高度动态改变时,在其高度需要更新时调用此方法 + updatePageScrollTopHeight() { + this._updatePageScrollTopOrBottomHeight('top'); + }, + // 当使用页面滚动并且设置了slot="bottom"时,默认初次加载会自动获取其高度,并使内部容器下移,当slot="bottom"的view高度动态改变时,在其高度需要更新时调用此方法 + updatePageScrollBottomHeight() { + this._updatePageScrollTopOrBottomHeight('bottom'); + }, + // 更新slot="left"和slot="right"宽度,当slot="left"或slot="right"宽度动态改变时调用 + updateLeftAndRightWidth() { + if (!this.finalIsOldWebView) return; + this.$nextTick(() => this._updateLeftAndRightWidth(this.scrollViewContainerStyle, 'zp-page')); + }, + // 更新z-paging内置scroll-view的scrollTop + updateScrollViewScrollTop(scrollTop, animate = true) { + this._updatePrivateScrollWithAnimation(animate); + this.scrollTop = this.oldScrollTop; + this.$nextTick(() => { + this.scrollTop = scrollTop; + this.oldScrollTop = this.scrollTop; + }); + }, + + // 当滚动到顶部时 + _onScrollToUpper() { + this.$emit('scrolltoupper'); + this.$emit('scrollTopChange', 0); + this.$nextTick(() => { + this.oldScrollTop = 0; + }) + }, + // 当滚动到底部时 + _onScrollToLower(e) { + (!e.detail || !e.detail.direction || e.detail.direction === 'bottom') && this._onLoadingMore(this.useChatRecordMode ? 'click' : 'toBottom') + }, + // 滚动到顶部 + _scrollToTop(animate = true, isPrivate = true) { + // #ifdef APP-NVUE + // 在nvue中需要通过weex.scrollToElement滚动到顶部,此时在顶部插入了一个view,使得滚动到这个view位置 + const el = this.$refs['zp-n-list-top-tag']; + if (this.usePageScroll) { + this._getNodeClientRect('zp-page-scroll-top', false).then(node => { + const nodeHeight = node ? node[0].height : 0; + weexDom.scrollToElement(el, { + offset: -nodeHeight, + animated: animate + }); + }); + } else { + if (!this.isIos && this.nvueListIs === 'scroller') { + this._getNodeClientRect('zp-n-refresh-container', false).then(node => { + const nodeHeight = node ? node[0].height : 0; + weexDom.scrollToElement(el, { + offset: -nodeHeight, + animated: animate + }); + }); + } else { + weexDom.scrollToElement(el, { + offset: 0, + animated: animate + }); + } + } + return; + // #endif + if (this.usePageScroll) { + this.$nextTick(() => { + uni.pageScrollTo({ + scrollTop: 0, + duration: animate ? 100 : 0, + }); + }); + return; + } + this._updatePrivateScrollWithAnimation(animate); + this.scrollTop = this.oldScrollTop; + this.$nextTick(() => { + this.scrollTop = 0; + this.oldScrollTop = this.scrollTop; + }); + }, + // 滚动到底部 + async _scrollToBottom(animate = true) { + // #ifdef APP-NVUE + // 在nvue中需要通过weex.scrollToElement滚动到顶部,此时在底部插入了一个view,使得滚动到这个view位置 + const el = this.$refs['zp-n-list-bottom-tag']; + if (el) { + weexDom.scrollToElement(el, { + offset: 0, + animated: animate + }); + } else { + u.consoleErr('滚动到底部失败,因为您设置了hideNvueBottomTag为true'); + } + return; + // #endif + if (this.usePageScroll) { + this.$nextTick(() => { + uni.pageScrollTo({ + scrollTop: Number.MAX_VALUE, + duration: animate ? 100 : 0, + }); + }); + return; + } + try { + this._updatePrivateScrollWithAnimation(animate); + const pagingContainerNode = await this._getNodeClientRect('.zp-paging-container'); + const scrollViewNode = await this._getNodeClientRect('.zp-scroll-view'); + const pagingContainerH = pagingContainerNode ? pagingContainerNode[0].height : 0; + const scrollViewH = scrollViewNode ? scrollViewNode[0].height : 0; + if (pagingContainerH > scrollViewH) { + this.scrollTop = this.oldScrollTop; + this.$nextTick(() => { + this.scrollTop = pagingContainerH - scrollViewH + this.virtualPlaceholderTopHeight; + this.oldScrollTop = this.scrollTop; + }); + } + } catch (e) {} + }, + // 滚动到指定view + _scrollIntoView(sel, offset = 0, animate = false, finishCallback) { + try { + this.scrollTop = this.oldScrollTop; + this.$nextTick(() => { + // #ifdef APP-NVUE + const refs = this.$parent.$refs; + if (!refs) return; + const dataType = Object.prototype.toString.call(sel); + let el = null; + if (dataType === '[object Number]') { + const els = refs[`z-paging-${sel}`]; + el = els ? els[0] : null; + } else if (dataType === '[object Array]') { + el = sel[0]; + } else { + el = sel; + } + if (el) { + weexDom.scrollToElement(el, { + offset: -offset, + animated: animate + }); + } else { + u.consoleErr('在nvue中滚动到指定位置,cell必须设置 :ref="`z-paging-${index}`"'); + } + return; + // #endif + this._getNodeClientRect('#' + sel.replace('#', ''), this.$parent).then((node) => { + if (node) { + let nodeTop = node[0].top; + this._scrollIntoViewByNodeTop(nodeTop, offset, animate); + finishCallback && finishCallback(); + } + }); + }); + } catch (e) {} + }, + // 通过nodeTop滚动到指定view + _scrollIntoViewByNodeTop(nodeTop, offset = 0, animate = false) { + // 如果是聊天记录模式并且列表倒置了,此时nodeTop需要等于scroll-view高度 - nodeTop + if (this.isChatRecordModeAndInversion) { + this._getNodeClientRect('.zp-scroll-view').then(sNode => { + if (sNode) { + this._scrollToY(sNode[0].height - nodeTop, offset, animate, true); + } + }) + } else { + this._scrollToY(nodeTop, offset, animate, true); + } + }, + // 滚动到指定位置 + _scrollToY(y, offset = 0, animate = false, addScrollTop = false) { + this._updatePrivateScrollWithAnimation(animate); + u.delay(() => { + if (this.usePageScroll) { + if (addScrollTop && this.pageScrollTop !== -1) { + y += this.pageScrollTop; + } + const scrollTop = y - offset; + uni.pageScrollTo({ + scrollTop, + duration: animate ? 100 : 0 + }); + } else { + if (addScrollTop) { + y += this.oldScrollTop; + } + this.scrollTop = y - offset; + } + }, 10) + }, + // scroll-view滚动中 + _scroll(e) { + this.$emit('scroll', e); + const scrollTop = e.detail.scrollTop; + // #ifndef APP-NVUE + this.finalUseVirtualList && this._updateVirtualScroll(scrollTop, this.oldScrollTop - scrollTop); + // #endif + this.oldScrollTop = scrollTop; + // 滚动区域内容的总高度 - 当前滚动的scrollTop = 当前滚动区域的顶部与内容底部的距离 + const scrollDiff = e.detail.scrollHeight - this.oldScrollTop; + // 在非ios平台滚动中,再次验证一下是否滚动到了底部。因为在一些安卓设备中,有概率滚动到底部不触发@scrolltolower事件,因此添加双重检测逻辑 + !this.isIos && this._checkScrolledToBottom(scrollDiff); + }, + // 更新内置的scroll-view是否启用滚动动画 + _updatePrivateScrollWithAnimation(animate) { + this.privateScrollWithAnimation = animate ? 1 : 0; + u.delay(() => this.$nextTick(() => { + // 在滚动结束后将滚动动画状态设置回初始状态 + this.privateScrollWithAnimation = -1; + }), 100, 'updateScrollWithAnimationDelay') + }, + // 检测scrollView是否要铺满屏幕 + _doCheckScrollViewShouldFullHeight(totalData) { + if (this.autoFullHeight && this.usePageScroll && this.isTotalChangeFromAddData) { + // #ifndef APP-NVUE + this.$nextTick(() => { + this._checkScrollViewShouldFullHeight((scrollViewNode, pagingContainerNode) => { + this._preCheckShowNoMoreInside(totalData, scrollViewNode, pagingContainerNode) + }); + }) + // #endif + // #ifdef APP-NVUE + this._preCheckShowNoMoreInside(totalData) + // #endif + } else { + this._preCheckShowNoMoreInside(totalData) + } + }, + // 检测z-paging是否要全屏覆盖(当使用页面滚动并且不满全屏时,默认z-paging需要铺满全屏,避免数据过少时内部的empty-view无法正确展示) + async _checkScrollViewShouldFullHeight(callback) { + try { + const scrollViewNode = await this._getNodeClientRect('.zp-scroll-view'); + const pagingContainerNode = await this._getNodeClientRect('.zp-paging-container-content'); + if (!scrollViewNode || !pagingContainerNode) return; + const scrollViewHeight = pagingContainerNode[0].height; + const scrollViewTop = scrollViewNode[0].top; + if (this.isAddedData && scrollViewHeight + scrollViewTop <= this.windowHeight) { + this._setAutoHeight(true, scrollViewNode); + callback(scrollViewNode, pagingContainerNode); + } else { + this._setAutoHeight(false); + callback(null, null); + } + } catch (e) { + callback(null, null); + } + }, + // 更新缓存中z-paging整个内容容器高度 + async _updateCachedSuperContentHeight() { + const superContentNode = await this._getNodeClientRect('.z-paging-content'); + if (superContentNode) { + this.superContentHeight = superContentNode[0].height; + } + }, + // scrollTop改变时触发 + _scrollTopChange(newVal, isPageScrollTop){ + this.$emit('scrollTopChange', newVal); + this.$emit('update:scrollTop', newVal); + this._checkShouldShowBackToTop(newVal); + // 之前在安卓中scroll-view有概率滚动到顶部时scrollTop不为0导致下拉刷新判断异常,因此判断scrollTop在105之内都允许下拉刷新,但此方案会导致某些情况(例如滚动到距离顶部10px处)下拉抖动,因此改为通过获取zp-scroll-view的节点信息中的scrollTop进行验证的方案 + // const scrollTop = this.isIos ? (newVal > 5 ? 6 : 0) : (newVal > 105 ? 106 : (newVal > 5 ? 6 : 0)); + const scrollTop = newVal > 5 ? 6 : 0; + if (isPageScrollTop && this.wxsPageScrollTop !== scrollTop) { + this.wxsPageScrollTop = scrollTop; + } else if (!isPageScrollTop && this.wxsScrollTop !== scrollTop) { + this.wxsScrollTop = scrollTop; + if (scrollTop > 6) { + this.scrollEnable = true; + } + } + }, + // 更新使用页面滚动时slot="top"或"bottom"插入view的高度 + _updatePageScrollTopOrBottomHeight(type) { + // #ifndef APP-NVUE + if (!this.usePageScroll) return; + // #endif + this._doCheckScrollViewShouldFullHeight(this.realTotalData); + const node = `.zp-page-${type}`; + const marginText = `margin${type.slice(0,1).toUpperCase() + type.slice(1)}`; + let safeAreaInsetBottomAdd = this.safeAreaInsetBottom; + this.$nextTick(() => { + let delayTime = 0; + // #ifdef MP-BAIDU || APP-NVUE + delayTime = 50; + // #endif + u.delay(() => { + this._getNodeClientRect(node).then((res) => { + if (res) { + let pageScrollNodeHeight = res[0].height; + if (type === 'bottom') { + if (safeAreaInsetBottomAdd) { + pageScrollNodeHeight += this.safeAreaBottom; + } + } else { + this.cacheTopHeight = pageScrollNodeHeight; + } + this.$set(this.scrollViewStyle, marginText, `${pageScrollNodeHeight}px`); + } else if (safeAreaInsetBottomAdd) { + this.$set(this.scrollViewStyle, marginText, `${this.safeAreaBottom}px`); + } + }); + }, delayTime) + }) + }, + } +} diff --git a/uni_modules/z-paging/components/z-paging/js/modules/virtual-list.js b/uni_modules/z-paging/components/z-paging/js/modules/virtual-list.js index d3090988..b4f9b600 100644 --- a/uni_modules/z-paging/components/z-paging/js/modules/virtual-list.js +++ b/uni_modules/z-paging/components/z-paging/js/modules/virtual-list.js @@ -1,512 +1,512 @@ -// [z-paging]虚拟列表模块 -import u from '.././z-paging-utils' -import c from '.././z-paging-constant' -import Enum from '.././z-paging-enum' - -export default { - props: { - // 是否使用虚拟列表,默认为否 - useVirtualList: { - type: Boolean, - default: u.gc('useVirtualList', false) - }, - // 在使用虚拟列表时,是否使用兼容模式,默认为否 - useCompatibilityMode: { - type: Boolean, - default: u.gc('useCompatibilityMode', false) - }, - // 使用兼容模式时传递的附加数据 - extraData: { - type: Object, - default: u.gc('extraData', {}) - }, - // 是否在z-paging内部循环渲染列表(内置列表),默认为否。若use-virtual-list为true,则此项恒为true - useInnerList: { - type: Boolean, - default: u.gc('useInnerList', false) - }, - // 强制关闭inner-list,默认为false,如果为true将强制关闭innerList,适用于开启了虚拟列表后需要强制关闭inner-list的情况 - forceCloseInnerList: { - type: Boolean, - default: u.gc('forceCloseInnerList', false) - }, - // 内置列表cell的key名称,仅nvue有效,在nvue中开启use-inner-list时必须填此项 - cellKeyName: { - type: String, - default: u.gc('cellKeyName', '') - }, - // innerList样式 - innerListStyle: { - type: Object, - default: u.gc('innerListStyle', {}) - }, - // innerCell样式 - innerCellStyle: { - type: Object, - default: u.gc('innerCellStyle', {}) - }, - // 预加载的列表可视范围(列表高度)页数,默认为12,即预加载当前页及上下各12页的cell。此数值越大,则虚拟列表中加载的dom越多,内存消耗越大(会维持在一个稳定值),但增加预加载页面数量可缓解快速滚动短暂白屏问题 - preloadPage: { - type: [Number, String], - default: u.gc('preloadPage', 12), - validator: (value) => { - if (value <= 0) u.consoleErr('preload-page必须大于0!'); - return value > 0; - } - }, - // 虚拟列表cell高度模式,默认为fixed,也就是每个cell高度完全相同,将以第一个cell高度为准进行计算。可选值【dynamic】,即代表高度是动态非固定的,【dynamic】性能低于【fixed】。 - cellHeightMode: { - type: String, - default: u.gc('cellHeightMode', Enum.CellHeightMode.Fixed) - }, - // 固定的cell高度,cellHeightMode=fixed才有效,若设置了值,则不计算第一个cell高度而使用设置的cell高度 - fixedCellHeight: { - type: [Number, String], - default: u.gc('fixedCellHeight', 0) - }, - // 虚拟列表列数,默认为1。常用于每行有多列的情况,例如每行有2列数据,需要将此值设置为2 - virtualListCol: { - type: [Number, String], - default: u.gc('virtualListCol', 1) - }, - // 虚拟列表scroll取样帧率,默认为80,过低容易出现白屏问题,过高容易出现卡顿问题 - virtualScrollFps: { - type: [Number, String], - default: u.gc('virtualScrollFps', 80) - }, - }, - data() { - return { - virtualListKey: u.getInstanceId(), - virtualPageHeight: 0, - virtualCellHeight: 0, - virtualScrollTimeStamp: 0, - - virtualList: [], - virtualPlaceholderTopHeight: 0, - virtualPlaceholderBottomHeight: 0, - virtualTopRangeIndex: 0, - virtualBottomRangeIndex: 0, - lastVirtualTopRangeIndex: 0, - lastVirtualBottomRangeIndex: 0, - virtualItemInsertedCount: 0, - - virtualHeightCacheList: [], - - getCellHeightRetryCount: { - fixed: 0, - dynamic: 0 - }, - pagingOrgTop: -1, - updateVirtualListFromDataChange: false - } - }, - watch: { - // 监听总数据的改变,刷新虚拟列表布局 - realTotalData() { - this.updateVirtualListRender(); - }, - // 监听虚拟列表渲染数组的改变并emit - virtualList(newVal){ - this.$emit('update:virtualList', newVal); - this.$emit('virtualListChange', newVal); - } - }, - computed: { - virtualCellIndexKey() { - return c.listCellIndexKey; - }, - finalUseVirtualList() { - if (this.useVirtualList && this.usePageScroll){ - u.consoleErr('使用页面滚动时,开启虚拟列表无效!'); - } - return this.useVirtualList && !this.usePageScroll; - }, - finalUseInnerList() { - return this.useInnerList || (this.finalUseVirtualList && !this.forceCloseInnerList); - }, - finalCellKeyName() { - // #ifdef APP-NVUE - if (this.finalUseVirtualList && !this.cellKeyName.length){ - u.consoleErr('在nvue中开启use-virtual-list必须设置cell-key-name,否则将可能导致列表渲染错误!'); - } - // #endif - return this.cellKeyName; - }, - finalVirtualPageHeight(){ - return this.virtualPageHeight > 0 ? this.virtualPageHeight : this.windowHeight; - }, - finalFixedCellHeight() { - return u.convertToPx(this.fixedCellHeight); - }, - virtualRangePageHeight(){ - return this.finalVirtualPageHeight * this.preloadPage; - }, - virtualScrollDisTimeStamp() { - return 1000 / this.virtualScrollFps; - }, - }, - methods: { - // 在使用动态高度虚拟列表时,若在列表数组中需要插入某个item,需要调用此方法;item:需要插入的item,index:插入的cell位置,若index为2,则插入的item在原list的index=1之后,index从0开始 - doInsertVirtualListItem(item, index) { - if (this.cellHeightMode !== Enum.CellHeightMode.Dynamic) return; - this.virtualItemInsertedCount ++; - if (!item || Object.prototype.toString.call(item) !== '[object Object]') { - item = { item }; - } - const cellIndexKey = this.virtualCellIndexKey; - item[cellIndexKey] = `custom-${this.virtualItemInsertedCount}`; - item[c.listCellIndexUniqueKey] = `${this.virtualListKey}-${item[cellIndexKey]}`; - this.$nextTick(async () => { - let retryCount = 0; - while (retryCount <= 10) { - await u.wait(c.delayTime); - - const cellNode = await this._getNodeClientRect(`#zp-id-${item[cellIndexKey]}`, this.finalUseInnerList); - // 如果获取当前cell的节点信息失败,则重试(不超过10次) - if (!cellNode) { - retryCount ++; - continue; - } - - const currentHeight = cellNode ? cellNode[0].height : 0; - const lastHeightCache = this.virtualHeightCacheList[index - 1]; - const lastTotalHeight = lastHeightCache ? lastHeightCache.totalHeight : 0; - // 在缓存的cell高度数组中,插入此cell高度信息 - this.virtualHeightCacheList.splice(index, 0, { - height: currentHeight, - lastTotalHeight, - totalHeight: lastTotalHeight + currentHeight - }); - - // 从当前index起后续的cell缓存高度的lastTotalHeight和totalHeight需要加上当前cell的高度 - for (let i = index + 1; i < this.virtualHeightCacheList.length; i++) { - const thisNode = this.virtualHeightCacheList[i]; - thisNode.lastTotalHeight += currentHeight; - thisNode.totalHeight += currentHeight; - } - - this._updateVirtualScroll(this.oldScrollTop); - break; - } - }) - }, - // 在使用动态高度虚拟列表时,手动更新指定cell的缓存高度(当cell高度在初始化之后再次改变时调用);index:需要更新的cell在列表中的位置,从0开始 - didUpdateVirtualListCell(index) { - if (this.cellHeightMode !== Enum.CellHeightMode.Dynamic) return; - const currentNode = this.virtualHeightCacheList[index]; - this.$nextTick(() => { - this._getNodeClientRect(`#zp-id-${index}`, this.finalUseInnerList).then(cellNode => { - // 更新当前cell的高度 - const cellNodeHeight = cellNode ? cellNode[0].height : 0; - const heightDis = cellNodeHeight - currentNode.height; - currentNode.height = cellNodeHeight; - currentNode.totalHeight = currentNode.lastTotalHeight + cellNodeHeight; - - // 从当前index起后续的cell缓存高度的lastTotalHeight和totalHeight需要加上当前cell变化的高度 - for (let i = index + 1; i < this.virtualHeightCacheList.length; i++) { - const thisNode = this.virtualHeightCacheList[i]; - thisNode.totalHeight += heightDis; - thisNode.lastTotalHeight += heightDis; - } - }); - }) - }, - // 在使用动态高度虚拟列表时,若删除了列表数组中的某个item,需要调用此方法以更新高度缓存数组;index:删除的cell在列表中的位置,从0开始 - didDeleteVirtualListCell(index) { - if (this.cellHeightMode !== Enum.CellHeightMode.Dynamic) return; - const currentNode = this.virtualHeightCacheList[index]; - // 从当前index起后续的cell缓存高度的lastTotalHeight和totalHeight需要减去当前cell的高度 - for (let i = index + 1; i < this.virtualHeightCacheList.length; i++) { - const thisNode = this.virtualHeightCacheList[i]; - thisNode.totalHeight -= currentNode.height; - thisNode.lastTotalHeight -= currentNode.height; - } - // 将当前cell的高度信息从高度缓存数组中删除 - this.virtualHeightCacheList.splice(index, 1); - }, - // 手动触发虚拟列表渲染更新,可用于解决例如修改了虚拟列表数组中元素,但展示未更新的情况 - updateVirtualListRender() { - // #ifndef APP-NVUE - if (this.finalUseVirtualList) { - this.updateVirtualListFromDataChange = true; - this.$nextTick(() => { - this.getCellHeightRetryCount.fixed = 0; - if (this.realTotalData.length) { - this.cellHeightMode === Enum.CellHeightMode.Fixed && this.isFirstPage && this._updateFixedCellHeight() - } else { - this._resetDynamicListState(!this.isUserPullDown); - } - this._updateVirtualScroll(this.oldScrollTop); - }) - } - // #endif - }, - // 初始化虚拟列表 - _virtualListInit() { - this.$nextTick(() => { - u.delay(() => { - // 获取虚拟列表滚动区域的高度 - this._getNodeClientRect('.zp-scroll-view').then(node => { - if (node) { - this.pagingOrgTop = node[0].top; - this.virtualPageHeight = node[0].height; - } - }); - }); - }) - }, - // cellHeightMode为fixed时获取第一个cell高度 - _updateFixedCellHeight() { - if (!this.finalFixedCellHeight) { - this.$nextTick(() => { - u.delay(() => { - this._getNodeClientRect(`#zp-id-${0}`,this.finalUseInnerList).then(cellNode => { - if (!cellNode) { - if (this.getCellHeightRetryCount.fixed > 10) return; - this.getCellHeightRetryCount.fixed ++; - // 如果获取第一个cell的节点信息失败,则重试(不超过10次) - this._updateFixedCellHeight(); - } else { - this.virtualCellHeight = cellNode[0].height; - this._updateVirtualScroll(this.oldScrollTop); - } - }); - }, c.delayTime, 'updateFixedCellHeightDelay'); - }) - } else { - this.virtualCellHeight = this.finalFixedCellHeight; - } - }, - // cellHeightMode为dynamic时获取每个cell高度 - _updateDynamicCellHeight(list, dataFrom = 'bottom') { - const dataFromTop = dataFrom === 'top'; - const heightCacheList = this.virtualHeightCacheList; - const currentCacheList = dataFromTop ? [] : heightCacheList; - let listTotalHeight = 0; - this.$nextTick(() => { - u.delay(async () => { - for (let i = 0; i < list.length; i++) { - const cellNode = await this._getNodeClientRect(`#zp-id-${list[i][this.virtualCellIndexKey]}`, this.finalUseInnerList); - const currentHeight = cellNode ? cellNode[0].height : 0; - if (!cellNode) { - if (this.getCellHeightRetryCount.dynamic <= 10) { - heightCacheList.splice(heightCacheList.length - i, i); - this.getCellHeightRetryCount.dynamic ++; - // 如果获取当前cell的节点信息失败,则重试(不超过10次) - this._updateDynamicCellHeight(list, dataFrom); - } - return; - } - const lastHeightCache = currentCacheList.length ? currentCacheList.slice(-1)[0] : null; - const lastTotalHeight = lastHeightCache ? lastHeightCache.totalHeight : 0; - // 缓存当前cell的高度信息:height-当前cell高度;lastTotalHeight-前面所有cell的高度总和;totalHeight-包含当前cell的所有高度总和 - currentCacheList.push({ - height: currentHeight, - lastTotalHeight, - totalHeight: lastTotalHeight + currentHeight - }); - if (dataFromTop) { - listTotalHeight += currentHeight; - } - } - // 如果数据是从顶部拼接的 - if (dataFromTop && list.length) { - for (let i = 0; i < heightCacheList.length; i++) { - // 更新之前所有项的缓存高度,需要加上此次插入的所有cell高度之和(因为是从顶部插入的cell) - const heightCacheItem = heightCacheList[i]; - heightCacheItem.lastTotalHeight += listTotalHeight; - heightCacheItem.totalHeight += listTotalHeight; - } - this.virtualHeightCacheList = currentCacheList.concat(heightCacheList); - } - this._updateVirtualScroll(this.oldScrollTop); - }, c.delayTime, 'updateDynamicCellHeightDelay') - }) - }, - // 设置cellItem的index - _setCellIndex(list, dataFrom = 'bottom') { - let currentItemIndex = 0; - const cellIndexKey = this.virtualCellIndexKey; - ([Enum.QueryFrom.Refresh, Enum.QueryFrom.Reload].indexOf(this.queryFrom) >= 0) && this._resetDynamicListState(); - if (this.totalData.length) { - if (dataFrom === 'bottom') { - currentItemIndex = this.realTotalData.length; - const lastItem = this.realTotalData.length ? this.realTotalData.slice(-1)[0] : null; - if (lastItem && lastItem[cellIndexKey] !== undefined) { - currentItemIndex = lastItem[cellIndexKey] + 1; - } - } else if (dataFrom === 'top') { - const firstItem = this.realTotalData.length ? this.realTotalData[0] : null; - if (firstItem && firstItem[cellIndexKey] !== undefined) { - currentItemIndex = firstItem[cellIndexKey] - list.length; - } - } - } else { - this._resetDynamicListState(); - } - for (let i = 0; i < list.length; i++) { - let item = list[i]; - if (!item || Object.prototype.toString.call(item) !== '[object Object]') { - item = { item }; - } - if (item[c.listCellIndexUniqueKey]) { - item = u.deepCopy(item); - } - item[cellIndexKey] = currentItemIndex + i; - item[c.listCellIndexUniqueKey] = `${this.virtualListKey}-${item[cellIndexKey]}`; - list[i] = item; - } - this.getCellHeightRetryCount.dynamic = 0; - this.cellHeightMode === Enum.CellHeightMode.Dynamic && this._updateDynamicCellHeight(list, dataFrom); - }, - // 更新scroll滚动(虚拟列表滚动时触发) - _updateVirtualScroll(scrollTop, scrollDiff = 0) { - const currentTimeStamp = u.getTime(); - scrollTop === 0 && this._resetTopRange(); - if (scrollTop !== 0 && this.virtualScrollTimeStamp && currentTimeStamp - this.virtualScrollTimeStamp <= this.virtualScrollDisTimeStamp) { - return; - } - this.virtualScrollTimeStamp = currentTimeStamp; - - let scrollIndex = 0; - const cellHeightMode = this.cellHeightMode; - if (cellHeightMode === Enum.CellHeightMode.Fixed) { - // 如果是固定高度的虚拟列表 - // 计算当前滚动到的cell的index = scrollTop / 虚拟列表cell的固定高度 - scrollIndex = parseInt(scrollTop / this.virtualCellHeight) || 0; - // 更新顶部和底部占位view的高度(为兼容考虑,顶部采用transformY的方式占位) - this._updateFixedTopRangeIndex(scrollIndex); - this._updateFixedBottomRangeIndex(scrollIndex); - } else if(cellHeightMode === Enum.CellHeightMode.Dynamic) { - // 如果是不固定高度的虚拟列表 - // 当前滚动的方向 - const scrollDirection = scrollDiff > 0 ? 'top' : 'bottom'; - // 视图区域的高度 - const rangePageHeight = this.virtualRangePageHeight; - // 顶部视图区域外的高度(顶部不需要渲染而是需要占位部分的高度) - const topRangePageOffset = scrollTop - rangePageHeight; - // 底部视图区域外的高度(底部不需要渲染而是需要占位部分的高度) - const bottomRangePageOffset = scrollTop + this.finalVirtualPageHeight + rangePageHeight; - - let virtualBottomRangeIndex = 0; - let virtualPlaceholderBottomHeight = 0; - let reachedLimitBottom = false; - const heightCacheList = this.virtualHeightCacheList; - const lastHeightCache = !!heightCacheList ? heightCacheList.slice(-1)[0] : null; - - let startTopRangeIndex = this.virtualTopRangeIndex; - // 如果是向底部滚动(顶部占位的高度不断增大,顶部的实际渲染cell数量不断减少) - if (scrollDirection === 'bottom') { - // 从顶部视图边缘的cell的位置开始向后查找 - for (let i = startTopRangeIndex; i < heightCacheList.length; i++){ - const heightCacheItem = heightCacheList[i]; - // 如果查找到某个cell对应的totalHeight大于顶部视图区域外的高度,则此cell为顶部视图边缘的cell - if (heightCacheItem && heightCacheItem.totalHeight > topRangePageOffset) { - // 记录顶部视图边缘cell的index并更新顶部占位区域的高度并停止继续查找 - this.virtualTopRangeIndex = i; - this.virtualPlaceholderTopHeight = heightCacheItem.lastTotalHeight; - break; - } - } - } else { - // 如果是向顶部滚动(顶部占位的高度不断减少,顶部的实际渲染cell数量不断增加) - let topRangeMatched = false; - // 从顶部视图边缘的cell的位置开始向前查找 - for (let i = startTopRangeIndex; i >= 0; i--){ - const heightCacheItem = heightCacheList[i]; - // 如果查找到某个cell对应的totalHeight小于顶部视图区域外的高度,则此cell为顶部视图边缘的cell - if (heightCacheItem && heightCacheItem.totalHeight < topRangePageOffset) { - // 记录顶部视图边缘cell的index并更新顶部占位区域的高度并停止继续查找 - this.virtualTopRangeIndex = i; - this.virtualPlaceholderTopHeight = heightCacheItem.lastTotalHeight; - topRangeMatched = true; - break; - } - } - // 如果查找不到,则认为顶部占位高度为0了,顶部cell不需要继续复用,重置topRangeIndex和placeholderTopHeight - !topRangeMatched && this._resetTopRange(); - } - // 从顶部视图边缘的cell的位置开始向后查找 - for (let i = this.virtualTopRangeIndex; i < heightCacheList.length; i++){ - const heightCacheItem = heightCacheList[i]; - // 如果查找到某个cell对应的totalHeight大于底部视图区域外的高度,则此cell为底部视图边缘的cell - if (heightCacheItem && heightCacheItem.totalHeight > bottomRangePageOffset) { - // 记录底部视图边缘cell的index并更新底部占位区域的高度并停止继续查找 - virtualBottomRangeIndex = i; - virtualPlaceholderBottomHeight = lastHeightCache.totalHeight - heightCacheItem.totalHeight; - reachedLimitBottom = true; - break; - } - } - if (!reachedLimitBottom || this.virtualBottomRangeIndex === 0) { - this.virtualBottomRangeIndex = this.realTotalData.length ? this.realTotalData.length - 1 : this.pageSize; - this.virtualPlaceholderBottomHeight = 0; - } else { - this.virtualBottomRangeIndex = virtualBottomRangeIndex; - this.virtualPlaceholderBottomHeight = virtualPlaceholderBottomHeight; - } - this._updateVirtualList(); - } - }, - // 更新fixedCell模式下topRangeIndex&placeholderTopHeight - _updateFixedTopRangeIndex(scrollIndex) { - let virtualTopRangeIndex = this.virtualCellHeight === 0 ? 0 : scrollIndex - (parseInt(this.finalVirtualPageHeight / this.virtualCellHeight) || 1) * this.preloadPage; - virtualTopRangeIndex *= this.virtualListCol; - virtualTopRangeIndex = Math.max(0, virtualTopRangeIndex); - this.virtualTopRangeIndex = virtualTopRangeIndex; - this.virtualPlaceholderTopHeight = (virtualTopRangeIndex / this.virtualListCol) * this.virtualCellHeight; - }, - // 更新fixedCell模式下bottomRangeIndex&placeholderBottomHeight - _updateFixedBottomRangeIndex(scrollIndex) { - let virtualBottomRangeIndex = this.virtualCellHeight === 0 ? this.pageSize : scrollIndex + (parseInt(this.finalVirtualPageHeight / this.virtualCellHeight) || 1) * (this.preloadPage + 1); - virtualBottomRangeIndex *= this.virtualListCol; - virtualBottomRangeIndex = Math.min(this.realTotalData.length, virtualBottomRangeIndex); - this.virtualBottomRangeIndex = virtualBottomRangeIndex; - this.virtualPlaceholderBottomHeight = (this.realTotalData.length - virtualBottomRangeIndex) * this.virtualCellHeight / this.virtualListCol; - this._updateVirtualList(); - }, - // 更新virtualList - _updateVirtualList() { - const shouldUpdateList = this.updateVirtualListFromDataChange || (this.lastVirtualTopRangeIndex !== this.virtualTopRangeIndex || this.lastVirtualBottomRangeIndex !== this.virtualBottomRangeIndex); - if (shouldUpdateList) { - this.updateVirtualListFromDataChange = false; - this.lastVirtualTopRangeIndex = this.virtualTopRangeIndex; - this.lastVirtualBottomRangeIndex = this.virtualBottomRangeIndex; - this.virtualList = this.realTotalData.slice(this.virtualTopRangeIndex, this.virtualBottomRangeIndex + 1); - } - }, - // 重置动态cell模式下的高度缓存数据、虚拟列表和滚动状态 - _resetDynamicListState(resetVirtualList = false) { - this.virtualHeightCacheList = []; - if (resetVirtualList) { - this.virtualList = []; - } - this.virtualTopRangeIndex = 0; - this.virtualPlaceholderTopHeight = 0; - }, - // 重置topRangeIndex和placeholderTopHeight - _resetTopRange() { - this.virtualTopRangeIndex = 0; - this.virtualPlaceholderTopHeight = 0; - this._updateVirtualList(); - }, - // 检测虚拟列表当前滚动位置,如发现滚动位置不正确则重新计算虚拟列表相关参数(为解决在App中可能出现的长时间进入后台后打开App白屏的问题) - _checkVirtualListScroll() { - if (this.finalUseVirtualList) { - this.$nextTick(() => { - this._getNodeClientRect('.zp-paging-touch-view').then(node => { - const currentTop = node ? node[0].top : 0; - if (!node || (currentTop === this.pagingOrgTop && this.virtualPlaceholderTopHeight !== 0)) { - this._updateVirtualScroll(0); - } - }); - }) - } - }, - // 处理使用内置列表时点击了cell事件 - _innerCellClick(item, index) { - this.$emit('innerCellClick', item, index); - } - } -} +// [z-paging]虚拟列表模块 +import u from '.././z-paging-utils' +import c from '.././z-paging-constant' +import Enum from '.././z-paging-enum' + +export default { + props: { + // 是否使用虚拟列表,默认为否 + useVirtualList: { + type: Boolean, + default: u.gc('useVirtualList', false) + }, + // 在使用虚拟列表时,是否使用兼容模式,默认为否 + useCompatibilityMode: { + type: Boolean, + default: u.gc('useCompatibilityMode', false) + }, + // 使用兼容模式时传递的附加数据 + extraData: { + type: Object, + default: u.gc('extraData', {}) + }, + // 是否在z-paging内部循环渲染列表(内置列表),默认为否。若use-virtual-list为true,则此项恒为true + useInnerList: { + type: Boolean, + default: u.gc('useInnerList', false) + }, + // 强制关闭inner-list,默认为false,如果为true将强制关闭innerList,适用于开启了虚拟列表后需要强制关闭inner-list的情况 + forceCloseInnerList: { + type: Boolean, + default: u.gc('forceCloseInnerList', false) + }, + // 内置列表cell的key名称,仅nvue有效,在nvue中开启use-inner-list时必须填此项 + cellKeyName: { + type: String, + default: u.gc('cellKeyName', '') + }, + // innerList样式 + innerListStyle: { + type: Object, + default: u.gc('innerListStyle', {}) + }, + // innerCell样式 + innerCellStyle: { + type: Object, + default: u.gc('innerCellStyle', {}) + }, + // 预加载的列表可视范围(列表高度)页数,默认为12,即预加载当前页及上下各12页的cell。此数值越大,则虚拟列表中加载的dom越多,内存消耗越大(会维持在一个稳定值),但增加预加载页面数量可缓解快速滚动短暂白屏问题 + preloadPage: { + type: [Number, String], + default: u.gc('preloadPage', 12), + validator: (value) => { + if (value <= 0) u.consoleErr('preload-page必须大于0!'); + return value > 0; + } + }, + // 虚拟列表cell高度模式,默认为fixed,也就是每个cell高度完全相同,将以第一个cell高度为准进行计算。可选值【dynamic】,即代表高度是动态非固定的,【dynamic】性能低于【fixed】。 + cellHeightMode: { + type: String, + default: u.gc('cellHeightMode', Enum.CellHeightMode.Fixed) + }, + // 固定的cell高度,cellHeightMode=fixed才有效,若设置了值,则不计算第一个cell高度而使用设置的cell高度 + fixedCellHeight: { + type: [Number, String], + default: u.gc('fixedCellHeight', 0) + }, + // 虚拟列表列数,默认为1。常用于每行有多列的情况,例如每行有2列数据,需要将此值设置为2 + virtualListCol: { + type: [Number, String], + default: u.gc('virtualListCol', 1) + }, + // 虚拟列表scroll取样帧率,默认为80,过低容易出现白屏问题,过高容易出现卡顿问题 + virtualScrollFps: { + type: [Number, String], + default: u.gc('virtualScrollFps', 80) + }, + }, + data() { + return { + virtualListKey: u.getInstanceId(), + virtualPageHeight: 0, + virtualCellHeight: 0, + virtualScrollTimeStamp: 0, + + virtualList: [], + virtualPlaceholderTopHeight: 0, + virtualPlaceholderBottomHeight: 0, + virtualTopRangeIndex: 0, + virtualBottomRangeIndex: 0, + lastVirtualTopRangeIndex: 0, + lastVirtualBottomRangeIndex: 0, + virtualItemInsertedCount: 0, + + virtualHeightCacheList: [], + + getCellHeightRetryCount: { + fixed: 0, + dynamic: 0 + }, + pagingOrgTop: -1, + updateVirtualListFromDataChange: false + } + }, + watch: { + // 监听总数据的改变,刷新虚拟列表布局 + realTotalData() { + this.updateVirtualListRender(); + }, + // 监听虚拟列表渲染数组的改变并emit + virtualList(newVal){ + this.$emit('update:virtualList', newVal); + this.$emit('virtualListChange', newVal); + } + }, + computed: { + virtualCellIndexKey() { + return c.listCellIndexKey; + }, + finalUseVirtualList() { + if (this.useVirtualList && this.usePageScroll){ + u.consoleErr('使用页面滚动时,开启虚拟列表无效!'); + } + return this.useVirtualList && !this.usePageScroll; + }, + finalUseInnerList() { + return this.useInnerList || (this.finalUseVirtualList && !this.forceCloseInnerList); + }, + finalCellKeyName() { + // #ifdef APP-NVUE + if (this.finalUseVirtualList && !this.cellKeyName.length){ + u.consoleErr('在nvue中开启use-virtual-list必须设置cell-key-name,否则将可能导致列表渲染错误!'); + } + // #endif + return this.cellKeyName; + }, + finalVirtualPageHeight(){ + return this.virtualPageHeight > 0 ? this.virtualPageHeight : this.windowHeight; + }, + finalFixedCellHeight() { + return u.convertToPx(this.fixedCellHeight); + }, + virtualRangePageHeight(){ + return this.finalVirtualPageHeight * this.preloadPage; + }, + virtualScrollDisTimeStamp() { + return 1000 / this.virtualScrollFps; + }, + }, + methods: { + // 在使用动态高度虚拟列表时,若在列表数组中需要插入某个item,需要调用此方法;item:需要插入的item,index:插入的cell位置,若index为2,则插入的item在原list的index=1之后,index从0开始 + doInsertVirtualListItem(item, index) { + if (this.cellHeightMode !== Enum.CellHeightMode.Dynamic) return; + this.virtualItemInsertedCount ++; + if (!item || Object.prototype.toString.call(item) !== '[object Object]') { + item = { item }; + } + const cellIndexKey = this.virtualCellIndexKey; + item[cellIndexKey] = `custom-${this.virtualItemInsertedCount}`; + item[c.listCellIndexUniqueKey] = `${this.virtualListKey}-${item[cellIndexKey]}`; + this.$nextTick(async () => { + let retryCount = 0; + while (retryCount <= 10) { + await u.wait(c.delayTime); + + const cellNode = await this._getNodeClientRect(`#zp-id-${item[cellIndexKey]}`, this.finalUseInnerList); + // 如果获取当前cell的节点信息失败,则重试(不超过10次) + if (!cellNode) { + retryCount ++; + continue; + } + + const currentHeight = cellNode ? cellNode[0].height : 0; + const lastHeightCache = this.virtualHeightCacheList[index - 1]; + const lastTotalHeight = lastHeightCache ? lastHeightCache.totalHeight : 0; + // 在缓存的cell高度数组中,插入此cell高度信息 + this.virtualHeightCacheList.splice(index, 0, { + height: currentHeight, + lastTotalHeight, + totalHeight: lastTotalHeight + currentHeight + }); + + // 从当前index起后续的cell缓存高度的lastTotalHeight和totalHeight需要加上当前cell的高度 + for (let i = index + 1; i < this.virtualHeightCacheList.length; i++) { + const thisNode = this.virtualHeightCacheList[i]; + thisNode.lastTotalHeight += currentHeight; + thisNode.totalHeight += currentHeight; + } + + this._updateVirtualScroll(this.oldScrollTop); + break; + } + }) + }, + // 在使用动态高度虚拟列表时,手动更新指定cell的缓存高度(当cell高度在初始化之后再次改变时调用);index:需要更新的cell在列表中的位置,从0开始 + didUpdateVirtualListCell(index) { + if (this.cellHeightMode !== Enum.CellHeightMode.Dynamic) return; + const currentNode = this.virtualHeightCacheList[index]; + this.$nextTick(() => { + this._getNodeClientRect(`#zp-id-${index}`, this.finalUseInnerList).then(cellNode => { + // 更新当前cell的高度 + const cellNodeHeight = cellNode ? cellNode[0].height : 0; + const heightDis = cellNodeHeight - currentNode.height; + currentNode.height = cellNodeHeight; + currentNode.totalHeight = currentNode.lastTotalHeight + cellNodeHeight; + + // 从当前index起后续的cell缓存高度的lastTotalHeight和totalHeight需要加上当前cell变化的高度 + for (let i = index + 1; i < this.virtualHeightCacheList.length; i++) { + const thisNode = this.virtualHeightCacheList[i]; + thisNode.totalHeight += heightDis; + thisNode.lastTotalHeight += heightDis; + } + }); + }) + }, + // 在使用动态高度虚拟列表时,若删除了列表数组中的某个item,需要调用此方法以更新高度缓存数组;index:删除的cell在列表中的位置,从0开始 + didDeleteVirtualListCell(index) { + if (this.cellHeightMode !== Enum.CellHeightMode.Dynamic) return; + const currentNode = this.virtualHeightCacheList[index]; + // 从当前index起后续的cell缓存高度的lastTotalHeight和totalHeight需要减去当前cell的高度 + for (let i = index + 1; i < this.virtualHeightCacheList.length; i++) { + const thisNode = this.virtualHeightCacheList[i]; + thisNode.totalHeight -= currentNode.height; + thisNode.lastTotalHeight -= currentNode.height; + } + // 将当前cell的高度信息从高度缓存数组中删除 + this.virtualHeightCacheList.splice(index, 1); + }, + // 手动触发虚拟列表渲染更新,可用于解决例如修改了虚拟列表数组中元素,但展示未更新的情况 + updateVirtualListRender() { + // #ifndef APP-NVUE + if (this.finalUseVirtualList) { + this.updateVirtualListFromDataChange = true; + this.$nextTick(() => { + this.getCellHeightRetryCount.fixed = 0; + if (this.realTotalData.length) { + this.cellHeightMode === Enum.CellHeightMode.Fixed && this.isFirstPage && this._updateFixedCellHeight() + } else { + this._resetDynamicListState(!this.isUserPullDown); + } + this._updateVirtualScroll(this.oldScrollTop); + }) + } + // #endif + }, + // 初始化虚拟列表 + _virtualListInit() { + this.$nextTick(() => { + u.delay(() => { + // 获取虚拟列表滚动区域的高度 + this._getNodeClientRect('.zp-scroll-view').then(node => { + if (node) { + this.pagingOrgTop = node[0].top; + this.virtualPageHeight = node[0].height; + } + }); + }); + }) + }, + // cellHeightMode为fixed时获取第一个cell高度 + _updateFixedCellHeight() { + if (!this.finalFixedCellHeight) { + this.$nextTick(() => { + u.delay(() => { + this._getNodeClientRect(`#zp-id-${0}`,this.finalUseInnerList).then(cellNode => { + if (!cellNode) { + if (this.getCellHeightRetryCount.fixed > 10) return; + this.getCellHeightRetryCount.fixed ++; + // 如果获取第一个cell的节点信息失败,则重试(不超过10次) + this._updateFixedCellHeight(); + } else { + this.virtualCellHeight = cellNode[0].height; + this._updateVirtualScroll(this.oldScrollTop); + } + }); + }, c.delayTime, 'updateFixedCellHeightDelay'); + }) + } else { + this.virtualCellHeight = this.finalFixedCellHeight; + } + }, + // cellHeightMode为dynamic时获取每个cell高度 + _updateDynamicCellHeight(list, dataFrom = 'bottom') { + const dataFromTop = dataFrom === 'top'; + const heightCacheList = this.virtualHeightCacheList; + const currentCacheList = dataFromTop ? [] : heightCacheList; + let listTotalHeight = 0; + this.$nextTick(() => { + u.delay(async () => { + for (let i = 0; i < list.length; i++) { + const cellNode = await this._getNodeClientRect(`#zp-id-${list[i][this.virtualCellIndexKey]}`, this.finalUseInnerList); + const currentHeight = cellNode ? cellNode[0].height : 0; + if (!cellNode) { + if (this.getCellHeightRetryCount.dynamic <= 10) { + heightCacheList.splice(heightCacheList.length - i, i); + this.getCellHeightRetryCount.dynamic ++; + // 如果获取当前cell的节点信息失败,则重试(不超过10次) + this._updateDynamicCellHeight(list, dataFrom); + } + return; + } + const lastHeightCache = currentCacheList.length ? currentCacheList.slice(-1)[0] : null; + const lastTotalHeight = lastHeightCache ? lastHeightCache.totalHeight : 0; + // 缓存当前cell的高度信息:height-当前cell高度;lastTotalHeight-前面所有cell的高度总和;totalHeight-包含当前cell的所有高度总和 + currentCacheList.push({ + height: currentHeight, + lastTotalHeight, + totalHeight: lastTotalHeight + currentHeight + }); + if (dataFromTop) { + listTotalHeight += currentHeight; + } + } + // 如果数据是从顶部拼接的 + if (dataFromTop && list.length) { + for (let i = 0; i < heightCacheList.length; i++) { + // 更新之前所有项的缓存高度,需要加上此次插入的所有cell高度之和(因为是从顶部插入的cell) + const heightCacheItem = heightCacheList[i]; + heightCacheItem.lastTotalHeight += listTotalHeight; + heightCacheItem.totalHeight += listTotalHeight; + } + this.virtualHeightCacheList = currentCacheList.concat(heightCacheList); + } + this._updateVirtualScroll(this.oldScrollTop); + }, c.delayTime, 'updateDynamicCellHeightDelay') + }) + }, + // 设置cellItem的index + _setCellIndex(list, dataFrom = 'bottom') { + let currentItemIndex = 0; + const cellIndexKey = this.virtualCellIndexKey; + ([Enum.QueryFrom.Refresh, Enum.QueryFrom.Reload].indexOf(this.queryFrom) >= 0) && this._resetDynamicListState(); + if (this.totalData.length) { + if (dataFrom === 'bottom') { + currentItemIndex = this.realTotalData.length; + const lastItem = this.realTotalData.length ? this.realTotalData.slice(-1)[0] : null; + if (lastItem && lastItem[cellIndexKey] !== undefined) { + currentItemIndex = lastItem[cellIndexKey] + 1; + } + } else if (dataFrom === 'top') { + const firstItem = this.realTotalData.length ? this.realTotalData[0] : null; + if (firstItem && firstItem[cellIndexKey] !== undefined) { + currentItemIndex = firstItem[cellIndexKey] - list.length; + } + } + } else { + this._resetDynamicListState(); + } + for (let i = 0; i < list.length; i++) { + let item = list[i]; + if (!item || Object.prototype.toString.call(item) !== '[object Object]') { + item = { item }; + } + if (item[c.listCellIndexUniqueKey]) { + item = u.deepCopy(item); + } + item[cellIndexKey] = currentItemIndex + i; + item[c.listCellIndexUniqueKey] = `${this.virtualListKey}-${item[cellIndexKey]}`; + list[i] = item; + } + this.getCellHeightRetryCount.dynamic = 0; + this.cellHeightMode === Enum.CellHeightMode.Dynamic && this._updateDynamicCellHeight(list, dataFrom); + }, + // 更新scroll滚动(虚拟列表滚动时触发) + _updateVirtualScroll(scrollTop, scrollDiff = 0) { + const currentTimeStamp = u.getTime(); + scrollTop === 0 && this._resetTopRange(); + if (scrollTop !== 0 && this.virtualScrollTimeStamp && currentTimeStamp - this.virtualScrollTimeStamp <= this.virtualScrollDisTimeStamp) { + return; + } + this.virtualScrollTimeStamp = currentTimeStamp; + + let scrollIndex = 0; + const cellHeightMode = this.cellHeightMode; + if (cellHeightMode === Enum.CellHeightMode.Fixed) { + // 如果是固定高度的虚拟列表 + // 计算当前滚动到的cell的index = scrollTop / 虚拟列表cell的固定高度 + scrollIndex = parseInt(scrollTop / this.virtualCellHeight) || 0; + // 更新顶部和底部占位view的高度(为兼容考虑,顶部采用transformY的方式占位) + this._updateFixedTopRangeIndex(scrollIndex); + this._updateFixedBottomRangeIndex(scrollIndex); + } else if(cellHeightMode === Enum.CellHeightMode.Dynamic) { + // 如果是不固定高度的虚拟列表 + // 当前滚动的方向 + const scrollDirection = scrollDiff > 0 ? 'top' : 'bottom'; + // 视图区域的高度 + const rangePageHeight = this.virtualRangePageHeight; + // 顶部视图区域外的高度(顶部不需要渲染而是需要占位部分的高度) + const topRangePageOffset = scrollTop - rangePageHeight; + // 底部视图区域外的高度(底部不需要渲染而是需要占位部分的高度) + const bottomRangePageOffset = scrollTop + this.finalVirtualPageHeight + rangePageHeight; + + let virtualBottomRangeIndex = 0; + let virtualPlaceholderBottomHeight = 0; + let reachedLimitBottom = false; + const heightCacheList = this.virtualHeightCacheList; + const lastHeightCache = !!heightCacheList ? heightCacheList.slice(-1)[0] : null; + + let startTopRangeIndex = this.virtualTopRangeIndex; + // 如果是向底部滚动(顶部占位的高度不断增大,顶部的实际渲染cell数量不断减少) + if (scrollDirection === 'bottom') { + // 从顶部视图边缘的cell的位置开始向后查找 + for (let i = startTopRangeIndex; i < heightCacheList.length; i++){ + const heightCacheItem = heightCacheList[i]; + // 如果查找到某个cell对应的totalHeight大于顶部视图区域外的高度,则此cell为顶部视图边缘的cell + if (heightCacheItem && heightCacheItem.totalHeight > topRangePageOffset) { + // 记录顶部视图边缘cell的index并更新顶部占位区域的高度并停止继续查找 + this.virtualTopRangeIndex = i; + this.virtualPlaceholderTopHeight = heightCacheItem.lastTotalHeight; + break; + } + } + } else { + // 如果是向顶部滚动(顶部占位的高度不断减少,顶部的实际渲染cell数量不断增加) + let topRangeMatched = false; + // 从顶部视图边缘的cell的位置开始向前查找 + for (let i = startTopRangeIndex; i >= 0; i--){ + const heightCacheItem = heightCacheList[i]; + // 如果查找到某个cell对应的totalHeight小于顶部视图区域外的高度,则此cell为顶部视图边缘的cell + if (heightCacheItem && heightCacheItem.totalHeight < topRangePageOffset) { + // 记录顶部视图边缘cell的index并更新顶部占位区域的高度并停止继续查找 + this.virtualTopRangeIndex = i; + this.virtualPlaceholderTopHeight = heightCacheItem.lastTotalHeight; + topRangeMatched = true; + break; + } + } + // 如果查找不到,则认为顶部占位高度为0了,顶部cell不需要继续复用,重置topRangeIndex和placeholderTopHeight + !topRangeMatched && this._resetTopRange(); + } + // 从顶部视图边缘的cell的位置开始向后查找 + for (let i = this.virtualTopRangeIndex; i < heightCacheList.length; i++){ + const heightCacheItem = heightCacheList[i]; + // 如果查找到某个cell对应的totalHeight大于底部视图区域外的高度,则此cell为底部视图边缘的cell + if (heightCacheItem && heightCacheItem.totalHeight > bottomRangePageOffset) { + // 记录底部视图边缘cell的index并更新底部占位区域的高度并停止继续查找 + virtualBottomRangeIndex = i; + virtualPlaceholderBottomHeight = lastHeightCache.totalHeight - heightCacheItem.totalHeight; + reachedLimitBottom = true; + break; + } + } + if (!reachedLimitBottom || this.virtualBottomRangeIndex === 0) { + this.virtualBottomRangeIndex = this.realTotalData.length ? this.realTotalData.length - 1 : this.pageSize; + this.virtualPlaceholderBottomHeight = 0; + } else { + this.virtualBottomRangeIndex = virtualBottomRangeIndex; + this.virtualPlaceholderBottomHeight = virtualPlaceholderBottomHeight; + } + this._updateVirtualList(); + } + }, + // 更新fixedCell模式下topRangeIndex&placeholderTopHeight + _updateFixedTopRangeIndex(scrollIndex) { + let virtualTopRangeIndex = this.virtualCellHeight === 0 ? 0 : scrollIndex - (parseInt(this.finalVirtualPageHeight / this.virtualCellHeight) || 1) * this.preloadPage; + virtualTopRangeIndex *= this.virtualListCol; + virtualTopRangeIndex = Math.max(0, virtualTopRangeIndex); + this.virtualTopRangeIndex = virtualTopRangeIndex; + this.virtualPlaceholderTopHeight = (virtualTopRangeIndex / this.virtualListCol) * this.virtualCellHeight; + }, + // 更新fixedCell模式下bottomRangeIndex&placeholderBottomHeight + _updateFixedBottomRangeIndex(scrollIndex) { + let virtualBottomRangeIndex = this.virtualCellHeight === 0 ? this.pageSize : scrollIndex + (parseInt(this.finalVirtualPageHeight / this.virtualCellHeight) || 1) * (this.preloadPage + 1); + virtualBottomRangeIndex *= this.virtualListCol; + virtualBottomRangeIndex = Math.min(this.realTotalData.length, virtualBottomRangeIndex); + this.virtualBottomRangeIndex = virtualBottomRangeIndex; + this.virtualPlaceholderBottomHeight = (this.realTotalData.length - virtualBottomRangeIndex) * this.virtualCellHeight / this.virtualListCol; + this._updateVirtualList(); + }, + // 更新virtualList + _updateVirtualList() { + const shouldUpdateList = this.updateVirtualListFromDataChange || (this.lastVirtualTopRangeIndex !== this.virtualTopRangeIndex || this.lastVirtualBottomRangeIndex !== this.virtualBottomRangeIndex); + if (shouldUpdateList) { + this.updateVirtualListFromDataChange = false; + this.lastVirtualTopRangeIndex = this.virtualTopRangeIndex; + this.lastVirtualBottomRangeIndex = this.virtualBottomRangeIndex; + this.virtualList = this.realTotalData.slice(this.virtualTopRangeIndex, this.virtualBottomRangeIndex + 1); + } + }, + // 重置动态cell模式下的高度缓存数据、虚拟列表和滚动状态 + _resetDynamicListState(resetVirtualList = false) { + this.virtualHeightCacheList = []; + if (resetVirtualList) { + this.virtualList = []; + } + this.virtualTopRangeIndex = 0; + this.virtualPlaceholderTopHeight = 0; + }, + // 重置topRangeIndex和placeholderTopHeight + _resetTopRange() { + this.virtualTopRangeIndex = 0; + this.virtualPlaceholderTopHeight = 0; + this._updateVirtualList(); + }, + // 检测虚拟列表当前滚动位置,如发现滚动位置不正确则重新计算虚拟列表相关参数(为解决在App中可能出现的长时间进入后台后打开App白屏的问题) + _checkVirtualListScroll() { + if (this.finalUseVirtualList) { + this.$nextTick(() => { + this._getNodeClientRect('.zp-paging-touch-view').then(node => { + const currentTop = node ? node[0].top : 0; + if (!node || (currentTop === this.pagingOrgTop && this.virtualPlaceholderTopHeight !== 0)) { + this._updateVirtualScroll(0); + } + }); + }) + } + }, + // 处理使用内置列表时点击了cell事件 + _innerCellClick(item, index) { + this.$emit('innerCellClick', item, index); + } + } +} diff --git a/uni_modules/z-paging/components/z-paging/js/z-paging-constant.js b/uni_modules/z-paging/components/z-paging/js/z-paging-constant.js index db65a904..d170150a 100644 --- a/uni_modules/z-paging/components/z-paging/js/z-paging-constant.js +++ b/uni_modules/z-paging/components/z-paging/js/z-paging-constant.js @@ -1,19 +1,19 @@ -// [z-paging]常量 - -export default { - // 当前版本号 - version: '2.7.11', - // 延迟操作的通用时间 - delayTime: 100, - // 请求失败时候全局emit使用的key - errorUpdateKey: 'z-paging-error-emit', - // 全局emit complete的key - completeUpdateKey: 'z-paging-complete-emit', - // z-paging缓存的前缀key - cachePrefixKey: 'z-paging-cache', - - // 虚拟列表中列表index的key - listCellIndexKey: 'zp_index', - // 虚拟列表中列表的唯一key - listCellIndexUniqueKey: 'zp_unique_index' -} +// [z-paging]常量 + +export default { + // 当前版本号 + version: '2.7.11', + // 延迟操作的通用时间 + delayTime: 100, + // 请求失败时候全局emit使用的key + errorUpdateKey: 'z-paging-error-emit', + // 全局emit complete的key + completeUpdateKey: 'z-paging-complete-emit', + // z-paging缓存的前缀key + cachePrefixKey: 'z-paging-cache', + + // 虚拟列表中列表index的key + listCellIndexKey: 'zp_index', + // 虚拟列表中列表的唯一key + listCellIndexUniqueKey: 'zp_unique_index' +} diff --git a/uni_modules/z-paging/components/z-paging/js/z-paging-enum.js b/uni_modules/z-paging/components/z-paging/js/z-paging-enum.js index 043d5b94..1cbd069b 100644 --- a/uni_modules/z-paging/components/z-paging/js/z-paging-enum.js +++ b/uni_modules/z-paging/components/z-paging/js/z-paging-enum.js @@ -1,45 +1,45 @@ -// [z-paging]枚举 - -export default { - // 当前加载类型 0.下拉刷新 1.上拉加载更多 - LoadingType: { - Refresher: 0, - LoadingMore: 1 - }, - // 下拉刷新状态 0.默认状态 1.松手立即刷新 2.刷新中 3.刷新结束 4.松手进入二楼 - Refresher: { - Default: 0, - ReleaseToRefresh: 1, - Loading: 2, - Complete: 3, - GoF2: 4 - }, - // 底部加载更多状态 0.默认状态 1.加载中 2.没有更多数据 3.加载失败 - More: { - Default: 0, - Loading: 1, - NoMore: 2, - Fail: 3 - }, - // @query触发来源 0.用户主动下拉刷新 1.通过reload触发 2.通过refresh触发 3.通过滚动到底部加载更多或点击底部加载更多触发 - QueryFrom: { - UserPullDown: 0, - Reload: 1, - Refresh: 2, - LoadingMore: 3 - }, - // 虚拟列表cell高度模式 - CellHeightMode: { - // 固定高度 - Fixed: 'fixed', - // 动态高度 - Dynamic: 'dynamic' - }, - // 列表缓存模式 - CacheMode: { - // 默认模式,只会缓存一次 - Default: 'default', - // 总是缓存,每次列表刷新(下拉刷新、调用reload等)都会更新缓存 - Always: 'always' - } +// [z-paging]枚举 + +export default { + // 当前加载类型 0.下拉刷新 1.上拉加载更多 + LoadingType: { + Refresher: 0, + LoadingMore: 1 + }, + // 下拉刷新状态 0.默认状态 1.松手立即刷新 2.刷新中 3.刷新结束 4.松手进入二楼 + Refresher: { + Default: 0, + ReleaseToRefresh: 1, + Loading: 2, + Complete: 3, + GoF2: 4 + }, + // 底部加载更多状态 0.默认状态 1.加载中 2.没有更多数据 3.加载失败 + More: { + Default: 0, + Loading: 1, + NoMore: 2, + Fail: 3 + }, + // @query触发来源 0.用户主动下拉刷新 1.通过reload触发 2.通过refresh触发 3.通过滚动到底部加载更多或点击底部加载更多触发 + QueryFrom: { + UserPullDown: 0, + Reload: 1, + Refresh: 2, + LoadingMore: 3 + }, + // 虚拟列表cell高度模式 + CellHeightMode: { + // 固定高度 + Fixed: 'fixed', + // 动态高度 + Dynamic: 'dynamic' + }, + // 列表缓存模式 + CacheMode: { + // 默认模式,只会缓存一次 + Default: 'default', + // 总是缓存,每次列表刷新(下拉刷新、调用reload等)都会更新缓存 + Always: 'always' + } } \ No newline at end of file diff --git a/uni_modules/z-paging/components/z-paging/js/z-paging-interceptor.js b/uni_modules/z-paging/components/z-paging/js/z-paging-interceptor.js index 147291a8..e94b61bd 100644 --- a/uni_modules/z-paging/components/z-paging/js/z-paging-interceptor.js +++ b/uni_modules/z-paging/components/z-paging/js/z-paging-interceptor.js @@ -1,97 +1,97 @@ -// [z-paging]拦截器 - -const queryKey = 'Query'; -const fetchParamsKey = 'FetchParams'; -const fetchResultKey = 'FetchResult'; -const language2LocalKey = 'Language2Local'; - -// 拦截&处理@query事件 -function handleQuery(callback) { - _addHandleByKey(queryKey, callback); - return this; -} - -// 拦截&处理@query事件(私有,请勿调用) -function _handleQuery(pageNo, pageSize, from, lastItem) { - const callback = _getHandleByKey(queryKey); - return callback ? callback(pageNo, pageSize, from, lastItem) : [pageNo, pageSize, from]; -} - -// 拦截&处理:fetch参数 -function handleFetchParams(callback) { - _addHandleByKey(fetchParamsKey, callback); - return this; -} - -// 拦截&处理:fetch参数(私有,请勿调用) -function _handleFetchParams(parmas, extraParams) { - const callback = _getHandleByKey(fetchParamsKey); - return callback ? callback(parmas, extraParams || {}) : { pageNo: parmas.pageNo, pageSize: parmas.pageSize, ...(extraParams || {}) }; -} - -// 拦截&处理:fetch结果 -function handleFetchResult(callback) { - _addHandleByKey(fetchResultKey, callback); - return this; -} - -// 拦截&处理:fetch结果(私有,请勿调用) -function _handleFetchResult(result, paging, params) { - const callback = _getHandleByKey(fetchResultKey); - callback && callback(result, paging, params); - return callback ? true : false; -} - -// 拦截&处理系统language转i18n local -function handleLanguage2Local(callback) { - _addHandleByKey(language2LocalKey, callback); - return this; -} - -// 拦截&处理系统language转i18n local(私有,请勿调用) -function _handleLanguage2Local(language, local) { - const callback = _getHandleByKey(language2LocalKey); - return callback ? callback(language, local) : local; -} - -// 获取当前app对象 -function _getApp(){ - // #ifndef APP-NVUE - return getApp(); - // #endif - // #ifdef APP-NVUE - return getApp({ allowDefault: true }); - // #endif -} - -// 是否可以访问globalData -function _hasGlobalData() { - return _getApp() && _getApp().globalData; -} - -// 添加处理函数 -function _addHandleByKey(key, callback) { - try { - setTimeout(function() { - if (_hasGlobalData()) { - _getApp().globalData[`zp_handle${key}Callback`] = callback; - } - }, 1); - } catch (_) {} -} - -// 获取处理回调函数 -function _getHandleByKey(key) { - return _hasGlobalData() ? _getApp().globalData[`zp_handle${key}Callback`] : null; -} - -export default { - handleQuery, - _handleQuery, - handleFetchParams, - _handleFetchParams, - handleFetchResult, - _handleFetchResult, - handleLanguage2Local, - _handleLanguage2Local -}; +// [z-paging]拦截器 + +const queryKey = 'Query'; +const fetchParamsKey = 'FetchParams'; +const fetchResultKey = 'FetchResult'; +const language2LocalKey = 'Language2Local'; + +// 拦截&处理@query事件 +function handleQuery(callback) { + _addHandleByKey(queryKey, callback); + return this; +} + +// 拦截&处理@query事件(私有,请勿调用) +function _handleQuery(pageNo, pageSize, from, lastItem) { + const callback = _getHandleByKey(queryKey); + return callback ? callback(pageNo, pageSize, from, lastItem) : [pageNo, pageSize, from]; +} + +// 拦截&处理:fetch参数 +function handleFetchParams(callback) { + _addHandleByKey(fetchParamsKey, callback); + return this; +} + +// 拦截&处理:fetch参数(私有,请勿调用) +function _handleFetchParams(parmas, extraParams) { + const callback = _getHandleByKey(fetchParamsKey); + return callback ? callback(parmas, extraParams || {}) : { pageNo: parmas.pageNo, pageSize: parmas.pageSize, ...(extraParams || {}) }; +} + +// 拦截&处理:fetch结果 +function handleFetchResult(callback) { + _addHandleByKey(fetchResultKey, callback); + return this; +} + +// 拦截&处理:fetch结果(私有,请勿调用) +function _handleFetchResult(result, paging, params) { + const callback = _getHandleByKey(fetchResultKey); + callback && callback(result, paging, params); + return callback ? true : false; +} + +// 拦截&处理系统language转i18n local +function handleLanguage2Local(callback) { + _addHandleByKey(language2LocalKey, callback); + return this; +} + +// 拦截&处理系统language转i18n local(私有,请勿调用) +function _handleLanguage2Local(language, local) { + const callback = _getHandleByKey(language2LocalKey); + return callback ? callback(language, local) : local; +} + +// 获取当前app对象 +function _getApp(){ + // #ifndef APP-NVUE + return getApp(); + // #endif + // #ifdef APP-NVUE + return getApp({ allowDefault: true }); + // #endif +} + +// 是否可以访问globalData +function _hasGlobalData() { + return _getApp() && _getApp().globalData; +} + +// 添加处理函数 +function _addHandleByKey(key, callback) { + try { + setTimeout(function() { + if (_hasGlobalData()) { + _getApp().globalData[`zp_handle${key}Callback`] = callback; + } + }, 1); + } catch (_) {} +} + +// 获取处理回调函数 +function _getHandleByKey(key) { + return _hasGlobalData() ? _getApp().globalData[`zp_handle${key}Callback`] : null; +} + +export default { + handleQuery, + _handleQuery, + handleFetchParams, + _handleFetchParams, + handleFetchResult, + _handleFetchResult, + handleLanguage2Local, + _handleLanguage2Local +}; diff --git a/uni_modules/z-paging/components/z-paging/js/z-paging-main.js b/uni_modules/z-paging/components/z-paging/js/z-paging-main.js index 11e18ded..f788dc6c 100644 --- a/uni_modules/z-paging/components/z-paging/js/z-paging-main.js +++ b/uni_modules/z-paging/components/z-paging/js/z-paging-main.js @@ -1,503 +1,503 @@ -// [z-paging]核心js - -import zStatic from './z-paging-static' -import c from './z-paging-constant' -import u from './z-paging-utils' - -import zPagingRefresh from '../components/z-paging-refresh' -import zPagingLoadMore from '../components/z-paging-load-more' -import zPagingEmptyView from '../../z-paging-empty-view/z-paging-empty-view' - -// modules -import commonLayoutModule from './modules/common-layout' -import dataHandleModule from './modules/data-handle' -import i18nModule from './modules/i18n' -import nvueModule from './modules/nvue' -import emptyModule from './modules/empty' -import refresherModule from './modules/refresher' -import loadMoreModule from './modules/load-more' -import loadingModule from './modules/loading' -import chatRecordModerModule from './modules/chat-record-mode' -import scrollerModule from './modules/scroller' -import backToTopModule from './modules/back-to-top' -import virtualListModule from './modules/virtual-list' - -import Enum from './z-paging-enum' - -const systemInfo = uni.getSystemInfoSync(); - -export default { - name: "z-paging", - components: { - zPagingRefresh, - zPagingLoadMore, - zPagingEmptyView - }, - mixins: [ - commonLayoutModule, - dataHandleModule, - i18nModule, - nvueModule, - emptyModule, - refresherModule, - loadMoreModule, - loadingModule, - chatRecordModerModule, - scrollerModule, - backToTopModule, - virtualListModule - ], - data() { - return { - // --------------静态资源--------------- - base64Arrow: zStatic.base64Arrow, - base64Flower: zStatic.base64Flower, - base64BackToTop: zStatic.base64BackToTop, - - // -------------全局数据相关-------------- - // 当前加载类型 - loadingType: Enum.LoadingType.Refresher, - requestTimeStamp: 0, - wxsPropType: '', - renderPropScrollTop: -1, - checkScrolledToBottomTimeOut: null, - cacheTopHeight: -1, - statusBarHeight: systemInfo.statusBarHeight, - - // --------------状态&判断--------------- - insideOfPaging: -1, - isLoadFailed: false, - isIos: systemInfo.platform === 'ios', - disabledBounce: false, - fromCompleteEmit: false, - disabledCompleteEmit: false, - pageLaunched: false, - active: false, - - // ---------------wxs相关--------------- - wxsIsScrollTopInTopRange: true, - wxsScrollTop: 0, - wxsPageScrollTop: 0, - wxsOnPullingDown: false, - }; - }, - props: { - // 调用complete后延迟处理的时间,单位为毫秒,默认0毫秒,优先级高于minDelay - delay: { - type: [Number, String], - default: u.gc('delay', 0), - }, - // 触发@query后最小延迟处理的时间,单位为毫秒,默认0毫秒,优先级低于delay(假设设置为300毫秒,若分页请求时间小于300毫秒,则在调用complete后延迟[300毫秒-请求时长];若请求时长大于300毫秒,则不延迟),当show-refresher-when-reload为true或reload(true)时,其最小值为400 - minDelay: { - type: [Number, String], - default: u.gc('minDelay', 0), - }, - // 设置z-paging的style,部分平台(如微信小程序)无法直接修改组件的style,可使用此属性代替 - pagingStyle: { - type: Object, - default: u.gc('pagingStyle', {}), - }, - // z-paging的高度,优先级低于pagingStyle中设置的height;传字符串,如100px、100rpx、100% - height: { - type: String, - default: u.gc('height', '') - }, - // z-paging的宽度,优先级低于pagingStyle中设置的width;传字符串,如100px、100rpx、100% - width: { - type: String, - default: u.gc('width', '') - }, - // z-paging的最大宽度,优先级低于pagingStyle中设置的max-width;传字符串,如100px、100rpx、100%。默认为空,也就是铺满窗口宽度,若设置了特定值则会自动添加margin: 0 auto - maxWidth: { - type: String, - default: u.gc('maxWidth', '') - }, - // z-paging的背景色,优先级低于pagingStyle中设置的background。传字符串,如"#ffffff" - bgColor: { - type: String, - default: u.gc('bgColor', '') - }, - // 设置z-paging的容器(插槽的父view)的style - pagingContentStyle: { - type: Object, - default: u.gc('pagingContentStyle', {}), - }, - // z-paging是否自动高度,若自动高度则会自动铺满屏幕 - autoHeight: { - type: Boolean, - default: u.gc('autoHeight', false) - }, - // z-paging是否自动高度时,附加的高度,注意添加单位px或rpx,若需要减少高度,则传负数 - autoHeightAddition: { - type: [Number, String], - default: u.gc('autoHeightAddition', '0px') - }, - // loading(下拉刷新、上拉加载更多)的主题样式,支持black,white,默认black - defaultThemeStyle: { - type: String, - default: u.gc('defaultThemeStyle', 'black') - }, - // z-paging是否使用fixed布局,若使用fixed布局,则z-paging的父view无需固定高度,z-paging高度默认为100%,默认为是(当使用内置scroll-view滚动时有效) - fixed: { - type: Boolean, - default: u.gc('fixed', true) - }, - // 是否开启底部安全区域适配 - safeAreaInsetBottom: { - type: Boolean, - default: u.gc('safeAreaInsetBottom', false) - }, - // 开启底部安全区域适配后,是否使用placeholder形式实现,默认为否。为否时滚动区域会自动避开底部安全区域,也就是所有滚动内容都不会挡住底部安全区域,若设置为是,则滚动时滚动内容会挡住底部安全区域,但是当滚动到底部时才会避开底部安全区域 - useSafeAreaPlaceholder: { - type: Boolean, - default: u.gc('useSafeAreaPlaceholder', false) - }, - // z-paging bottom的背景色,默认透明,传字符串,如"#ffffff" - bottomBgColor: { - type: String, - default: u.gc('bottomBgColor', '') - }, - // slot="top"的view的z-index,默认为99,仅使用页面滚动时有效 - topZIndex: { - type: Number, - default: u.gc('topZIndex', 99) - }, - // z-paging内容容器父view的z-index,默认为1 - superContentZIndex: { - type: Number, - default: u.gc('superContentZIndex', 1) - }, - // z-paging内容容器部分的z-index,默认为1 - contentZIndex: { - type: Number, - default: u.gc('contentZIndex', 1) - }, - // z-paging二楼的z-index,默认为100 - f2ZIndex: { - type: Number, - default: u.gc('f2ZIndex', 100) - }, - // 使用页面滚动时,是否在不满屏时自动填充满屏幕,默认为是 - autoFullHeight: { - type: Boolean, - default: u.gc('autoFullHeight', true) - }, - // 是否监听列表触摸方向改变,默认为否 - watchTouchDirectionChange: { - type: Boolean, - default: u.gc('watchTouchDirectionChange', false) - }, - // z-paging中布局的单位,默认为rpx - unit: { - type: String, - default: u.gc('unit', 'rpx') - } - }, - created() { - // 组件创建时,检测是否开始加载状态 - if (this.createdReload && !this.refresherOnly && this.auto) { - this._startLoading(); - this.$nextTick(this._preReload); - } - }, - mounted() { - this.active = true; - this.wxsPropType = u.getTime().toString(); - this.renderJsIgnore; - if (!this.createdReload && !this.refresherOnly && this.auto) { - // 开始预加载 - u.delay(() => this.$nextTick(this._preReload), 0); - } - // 如果开启了列表缓存,在初始化的时候通过缓存数据填充列表数据 - this.finalUseCache && this._setListByLocalCache(); - let delay = 0; - // #ifdef H5 || MP - delay = c.delayTime; - // #endif - this.$nextTick(() => { - // 初始化systemInfo - this.systemInfo = uni.getSystemInfoSync(); - // 初始化z-paging高度 - !this.usePageScroll && this.autoHeight && this._setAutoHeight(); - this.loaded = true; - u.delay(() => { - // 更新fixed模式下z-paging的布局,主要是更新windowTop、windowBottom - this.updateFixedLayout(); - // 更新缓存中z-paging整个内容容器高度 - this._updateCachedSuperContentHeight(); - }); - }) - // 初始化页面滚动模式下slot="top"、slot="bottom"高度 - this.updatePageScrollTopHeight(); - this.updatePageScrollBottomHeight(); - // 初始化slot="left"、slot="right"宽度 - this.updateLeftAndRightWidth(); - if (this.finalRefresherEnabled && this.useCustomRefresher) { - this.$nextTick(() => { - this.isTouchmoving = true; - }) - } - // 监听uni.$emit中全局emit的complete error等事件 - this._onEmit(); - // #ifdef APP-NVUE - if (!this.isIos && !this.useChatRecordMode) { - this.nLoadingMoreFixedHeight = true; - } - // 在nvue中更新nvue下拉刷新view容器的宽度,而不是写死默认的750rpx,需要考虑列表宽度不是铺满屏幕的情况 - this._nUpdateRefresherWidth(); - // #endif - // #ifndef APP-NVUE - // 虚拟列表模式时,初始化数据 - this.finalUseVirtualList && this._virtualListInit(); - // #endif - // #ifndef APP-PLUS - this.$nextTick(() => { - // 非app平台中,在通过获取css设置的底部安全区域占位view高度设置bottom距离后,更新页面滚动底部高度 - setTimeout(() => { - this._getCssSafeAreaInsetBottom(() => this.safeAreaInsetBottom && this.updatePageScrollBottomHeight()); - }, delay) - }) - // #endif - }, - destroyed() { - this._handleUnmounted(); - }, - // #ifdef VUE3 - unmounted() { - this._handleUnmounted(); - }, - // #endif - watch: { - defaultThemeStyle: { - handler(newVal) { - if (newVal.length) { - this.finalRefresherDefaultStyle = newVal; - } - }, - immediate: true - }, - autoHeight(newVal) { - this.loaded && !this.usePageScroll && this._setAutoHeight(newVal); - }, - autoHeightAddition(newVal) { - this.loaded && !this.usePageScroll && this.autoHeight && this._setAutoHeight(newVal); - }, - }, - computed: { - // 当前z-paging的内置样式 - finalPagingStyle() { - const pagingStyle = { ...this.pagingStyle }; - if (!this.systemInfo) return pagingStyle; - const { windowTop, windowBottom } = this; - if (!this.usePageScroll && this.fixed) { - if (windowTop && !pagingStyle.top) { - pagingStyle.top = windowTop + 'px'; - } - if (windowBottom && !pagingStyle.bottom) { - pagingStyle.bottom = windowBottom + 'px'; - } - } - if (this.bgColor.length && !pagingStyle['background']) { - pagingStyle['background'] = this.bgColor; - } - if (this.height.length && !pagingStyle['height']) { - pagingStyle['height'] = this.height; - } - if (this.width.length && !pagingStyle['width']) { - pagingStyle['width'] = this.width; - } - if (this.maxWidth.length && !pagingStyle['max-width']) { - pagingStyle['max-width'] = this.maxWidth; - pagingStyle['margin'] = '0 auto'; - } - return pagingStyle; - }, - // 当前z-paging内容的样式 - finalPagingContentStyle() { - if (this.contentZIndex != 1) { - this.pagingContentStyle['z-index'] = this.contentZIndex; - this.pagingContentStyle['position'] = 'relative'; - } - return this.pagingContentStyle; - }, - - renderJsIgnore() { - if ((this.usePageScroll && this.useChatRecordMode) || (!this.refresherEnabled && this.scrollable) || !this.useCustomRefresher) { - this.$nextTick(() => { - this.renderPropScrollTop = 10; - }) - } - return 0; - }, - windowHeight() { - if (!this.systemInfo) return 0; - return this.systemInfo.windowHeight || 0; - }, - windowBottom() { - if (!this.systemInfo) return 0; - let windowBottom = this.systemInfo.windowBottom || 0; - // 如果开启底部安全区域适配并且不使用placeholder的形式体现并且不是聊天记录模式(因为聊天记录模式在keyboardHeight计算初已添加了底部安全区域),在windowBottom添加底部安全区域高度 - if (this.safeAreaInsetBottom && !this.useSafeAreaPlaceholder && !this.useChatRecordMode) { - windowBottom += this.safeAreaBottom; - } - return windowBottom; - }, - isIosAndH5() { - // #ifndef H5 - return false; - // #endif - return this.isIos; - } - }, - methods: { - // 当前版本号 - getVersion() { - return `z-paging v${c.version}`; - }, - // 设置nvue List的specialEffects - setSpecialEffects(args) { - this.setListSpecialEffects(args); - }, - // 与setSpecialEffects等效,兼容旧版本 - setListSpecialEffects(args) { - this.nFixFreezing = args && Object.keys(args).length; - if (this.isIos) { - this.privateRefresherEnabled = 0; - } - !this.usePageScroll && this.$refs['zp-n-list'].setSpecialEffects(args); - }, - // #ifdef APP-VUE - // 当app长时间进入后台后进入前台,因系统内存管理导致app重新加载时,进行一些适配处理 - _handlePageLaunch() { - // 首次触发不进行处理,只有进入后台后打开app重新加载时才处理 - if (this.pageLaunched) { - // 解决在vue3+ios中,app ReLaunch时顶部下拉刷新展示位置向下偏移的问题 - // #ifdef VUE3 - this.refresherThresholdUpdateTag = 1; - this.$nextTick(() => { - this.refresherThresholdUpdateTag = 0; - }) - // #endif - // 解决使用虚拟列表时,app ReLaunch时白屏问题 - this._checkVirtualListScroll(); - } - this.pageLaunched = true; - }, - // #endif - // 使手机发生较短时间的振动(15ms) - _doVibrateShort() { - // #ifndef H5 - - // #ifdef APP-PLUS - if (this.isIos) { - const UISelectionFeedbackGenerator = plus.ios.importClass('UISelectionFeedbackGenerator'); - const feedbackGenerator = new UISelectionFeedbackGenerator(); - feedbackGenerator.init(); - setTimeout(() => { - feedbackGenerator.selectionChanged(); - }, 0) - } else { - plus.device.vibrate(15); - } - // #endif - // #ifndef APP-PLUS - uni.vibrateShort(); - // #endif - - // #endif - }, - // 设置z-paging高度 - async _setAutoHeight(shouldFullHeight = true, scrollViewNode = null) { - let heightKey = 'min-height'; - // #ifndef APP-NVUE - heightKey = 'min-height'; - // #endif - try { - if (shouldFullHeight) { - // 如果需要铺满全屏,则计算当前全屏可是区域的高度 - let finalScrollViewNode = scrollViewNode || await this._getNodeClientRect('.zp-scroll-view'); - let finalScrollBottomNode = await this._getNodeClientRect('.zp-page-bottom'); - if (finalScrollViewNode) { - const scrollViewTop = finalScrollViewNode[0].top; - let scrollViewHeight = this.windowHeight - scrollViewTop; - scrollViewHeight -= finalScrollBottomNode ? finalScrollBottomNode[0].height : 0; - const additionHeight = u.convertToPx(this.autoHeightAddition); - const finalHeight = scrollViewHeight + additionHeight - (this.insideMore ? 1 : 0) + 'px !important'; - this.$set(this.scrollViewStyle, heightKey, finalHeight); - this.$set(this.scrollViewInStyle, heightKey, finalHeight); - } - } else { - this.$delete(this.scrollViewStyle, heightKey); - this.$delete(this.scrollViewInStyle, heightKey); - } - } catch (e) {} - }, - // 组件销毁后续处理 - _handleUnmounted() { - this.active = false; - this._offEmit(); - // 取消监听键盘高度变化事件(H5、百度小程序、抖音小程序、飞书小程序、QQ小程序、快手小程序不支持) - // #ifndef H5 || MP-BAIDU || MP-TOUTIAO || MP-QQ || MP-KUAISHOU - this.useChatRecordMode && uni.offKeyboardHeightChange(this._handleKeyboardHeightChange); - // #endif - }, - // 触发更新是否超出页面状态 - _updateInsideOfPaging() { - this.insideMore && this.insideOfPaging === true && setTimeout(this.doLoadMore, 200) - }, - // 清除timeout - _cleanTimeout(timeout) { - if (timeout) { - clearTimeout(timeout); - timeout = null; - } - return timeout; - }, - // 添加全局emit监听 - _onEmit() { - uni.$on(c.errorUpdateKey, (errorMsg) => { - if (this.loading) { - if (!!errorMsg) { - this.customerEmptyViewErrorText = errorMsg; - } - this.complete(false).catch(() => {}); - } - }) - uni.$on(c.completeUpdateKey, (data) => { - setTimeout(() => { - if (this.loading) { - if (!this.disabledCompleteEmit) { - const type = data.type || 'normal'; - const list = data.list || data; - const rule = data.rule; - this.fromCompleteEmit = true; - switch (type){ - case 'normal': - this.complete(list); - break; - case 'total': - this.completeByTotal(list, rule); - break; - case 'nomore': - this.completeByNoMore(list, rule); - break; - case 'key': - this.completeByKey(list, rule); - break; - default: - break; - } - } else { - this.disabledCompleteEmit = false; - } - } - }, 1); - }) - }, - // 销毁全局emit和listener监听 - _offEmit(){ - uni.$off(c.errorUpdateKey); - uni.$off(c.completeUpdateKey); - }, - }, -}; +// [z-paging]核心js + +import zStatic from './z-paging-static' +import c from './z-paging-constant' +import u from './z-paging-utils' + +import zPagingRefresh from '../components/z-paging-refresh' +import zPagingLoadMore from '../components/z-paging-load-more' +import zPagingEmptyView from '../../z-paging-empty-view/z-paging-empty-view' + +// modules +import commonLayoutModule from './modules/common-layout' +import dataHandleModule from './modules/data-handle' +import i18nModule from './modules/i18n' +import nvueModule from './modules/nvue' +import emptyModule from './modules/empty' +import refresherModule from './modules/refresher' +import loadMoreModule from './modules/load-more' +import loadingModule from './modules/loading' +import chatRecordModerModule from './modules/chat-record-mode' +import scrollerModule from './modules/scroller' +import backToTopModule from './modules/back-to-top' +import virtualListModule from './modules/virtual-list' + +import Enum from './z-paging-enum' + +const systemInfo = uni.getSystemInfoSync(); + +export default { + name: "z-paging", + components: { + zPagingRefresh, + zPagingLoadMore, + zPagingEmptyView + }, + mixins: [ + commonLayoutModule, + dataHandleModule, + i18nModule, + nvueModule, + emptyModule, + refresherModule, + loadMoreModule, + loadingModule, + chatRecordModerModule, + scrollerModule, + backToTopModule, + virtualListModule + ], + data() { + return { + // --------------静态资源--------------- + base64Arrow: zStatic.base64Arrow, + base64Flower: zStatic.base64Flower, + base64BackToTop: zStatic.base64BackToTop, + + // -------------全局数据相关-------------- + // 当前加载类型 + loadingType: Enum.LoadingType.Refresher, + requestTimeStamp: 0, + wxsPropType: '', + renderPropScrollTop: -1, + checkScrolledToBottomTimeOut: null, + cacheTopHeight: -1, + statusBarHeight: systemInfo.statusBarHeight, + + // --------------状态&判断--------------- + insideOfPaging: -1, + isLoadFailed: false, + isIos: systemInfo.platform === 'ios', + disabledBounce: false, + fromCompleteEmit: false, + disabledCompleteEmit: false, + pageLaunched: false, + active: false, + + // ---------------wxs相关--------------- + wxsIsScrollTopInTopRange: true, + wxsScrollTop: 0, + wxsPageScrollTop: 0, + wxsOnPullingDown: false, + }; + }, + props: { + // 调用complete后延迟处理的时间,单位为毫秒,默认0毫秒,优先级高于minDelay + delay: { + type: [Number, String], + default: u.gc('delay', 0), + }, + // 触发@query后最小延迟处理的时间,单位为毫秒,默认0毫秒,优先级低于delay(假设设置为300毫秒,若分页请求时间小于300毫秒,则在调用complete后延迟[300毫秒-请求时长];若请求时长大于300毫秒,则不延迟),当show-refresher-when-reload为true或reload(true)时,其最小值为400 + minDelay: { + type: [Number, String], + default: u.gc('minDelay', 0), + }, + // 设置z-paging的style,部分平台(如微信小程序)无法直接修改组件的style,可使用此属性代替 + pagingStyle: { + type: Object, + default: u.gc('pagingStyle', {}), + }, + // z-paging的高度,优先级低于pagingStyle中设置的height;传字符串,如100px、100rpx、100% + height: { + type: String, + default: u.gc('height', '') + }, + // z-paging的宽度,优先级低于pagingStyle中设置的width;传字符串,如100px、100rpx、100% + width: { + type: String, + default: u.gc('width', '') + }, + // z-paging的最大宽度,优先级低于pagingStyle中设置的max-width;传字符串,如100px、100rpx、100%。默认为空,也就是铺满窗口宽度,若设置了特定值则会自动添加margin: 0 auto + maxWidth: { + type: String, + default: u.gc('maxWidth', '') + }, + // z-paging的背景色,优先级低于pagingStyle中设置的background。传字符串,如"#ffffff" + bgColor: { + type: String, + default: u.gc('bgColor', '') + }, + // 设置z-paging的容器(插槽的父view)的style + pagingContentStyle: { + type: Object, + default: u.gc('pagingContentStyle', {}), + }, + // z-paging是否自动高度,若自动高度则会自动铺满屏幕 + autoHeight: { + type: Boolean, + default: u.gc('autoHeight', false) + }, + // z-paging是否自动高度时,附加的高度,注意添加单位px或rpx,若需要减少高度,则传负数 + autoHeightAddition: { + type: [Number, String], + default: u.gc('autoHeightAddition', '0px') + }, + // loading(下拉刷新、上拉加载更多)的主题样式,支持black,white,默认black + defaultThemeStyle: { + type: String, + default: u.gc('defaultThemeStyle', 'black') + }, + // z-paging是否使用fixed布局,若使用fixed布局,则z-paging的父view无需固定高度,z-paging高度默认为100%,默认为是(当使用内置scroll-view滚动时有效) + fixed: { + type: Boolean, + default: u.gc('fixed', true) + }, + // 是否开启底部安全区域适配 + safeAreaInsetBottom: { + type: Boolean, + default: u.gc('safeAreaInsetBottom', false) + }, + // 开启底部安全区域适配后,是否使用placeholder形式实现,默认为否。为否时滚动区域会自动避开底部安全区域,也就是所有滚动内容都不会挡住底部安全区域,若设置为是,则滚动时滚动内容会挡住底部安全区域,但是当滚动到底部时才会避开底部安全区域 + useSafeAreaPlaceholder: { + type: Boolean, + default: u.gc('useSafeAreaPlaceholder', false) + }, + // z-paging bottom的背景色,默认透明,传字符串,如"#ffffff" + bottomBgColor: { + type: String, + default: u.gc('bottomBgColor', '') + }, + // slot="top"的view的z-index,默认为99,仅使用页面滚动时有效 + topZIndex: { + type: Number, + default: u.gc('topZIndex', 99) + }, + // z-paging内容容器父view的z-index,默认为1 + superContentZIndex: { + type: Number, + default: u.gc('superContentZIndex', 1) + }, + // z-paging内容容器部分的z-index,默认为1 + contentZIndex: { + type: Number, + default: u.gc('contentZIndex', 1) + }, + // z-paging二楼的z-index,默认为100 + f2ZIndex: { + type: Number, + default: u.gc('f2ZIndex', 100) + }, + // 使用页面滚动时,是否在不满屏时自动填充满屏幕,默认为是 + autoFullHeight: { + type: Boolean, + default: u.gc('autoFullHeight', true) + }, + // 是否监听列表触摸方向改变,默认为否 + watchTouchDirectionChange: { + type: Boolean, + default: u.gc('watchTouchDirectionChange', false) + }, + // z-paging中布局的单位,默认为rpx + unit: { + type: String, + default: u.gc('unit', 'rpx') + } + }, + created() { + // 组件创建时,检测是否开始加载状态 + if (this.createdReload && !this.refresherOnly && this.auto) { + this._startLoading(); + this.$nextTick(this._preReload); + } + }, + mounted() { + this.active = true; + this.wxsPropType = u.getTime().toString(); + this.renderJsIgnore; + if (!this.createdReload && !this.refresherOnly && this.auto) { + // 开始预加载 + u.delay(() => this.$nextTick(this._preReload), 0); + } + // 如果开启了列表缓存,在初始化的时候通过缓存数据填充列表数据 + this.finalUseCache && this._setListByLocalCache(); + let delay = 0; + // #ifdef H5 || MP + delay = c.delayTime; + // #endif + this.$nextTick(() => { + // 初始化systemInfo + this.systemInfo = uni.getSystemInfoSync(); + // 初始化z-paging高度 + !this.usePageScroll && this.autoHeight && this._setAutoHeight(); + this.loaded = true; + u.delay(() => { + // 更新fixed模式下z-paging的布局,主要是更新windowTop、windowBottom + this.updateFixedLayout(); + // 更新缓存中z-paging整个内容容器高度 + this._updateCachedSuperContentHeight(); + }); + }) + // 初始化页面滚动模式下slot="top"、slot="bottom"高度 + this.updatePageScrollTopHeight(); + this.updatePageScrollBottomHeight(); + // 初始化slot="left"、slot="right"宽度 + this.updateLeftAndRightWidth(); + if (this.finalRefresherEnabled && this.useCustomRefresher) { + this.$nextTick(() => { + this.isTouchmoving = true; + }) + } + // 监听uni.$emit中全局emit的complete error等事件 + this._onEmit(); + // #ifdef APP-NVUE + if (!this.isIos && !this.useChatRecordMode) { + this.nLoadingMoreFixedHeight = true; + } + // 在nvue中更新nvue下拉刷新view容器的宽度,而不是写死默认的750rpx,需要考虑列表宽度不是铺满屏幕的情况 + this._nUpdateRefresherWidth(); + // #endif + // #ifndef APP-NVUE + // 虚拟列表模式时,初始化数据 + this.finalUseVirtualList && this._virtualListInit(); + // #endif + // #ifndef APP-PLUS + this.$nextTick(() => { + // 非app平台中,在通过获取css设置的底部安全区域占位view高度设置bottom距离后,更新页面滚动底部高度 + setTimeout(() => { + this._getCssSafeAreaInsetBottom(() => this.safeAreaInsetBottom && this.updatePageScrollBottomHeight()); + }, delay) + }) + // #endif + }, + destroyed() { + this._handleUnmounted(); + }, + // #ifdef VUE3 + unmounted() { + this._handleUnmounted(); + }, + // #endif + watch: { + defaultThemeStyle: { + handler(newVal) { + if (newVal.length) { + this.finalRefresherDefaultStyle = newVal; + } + }, + immediate: true + }, + autoHeight(newVal) { + this.loaded && !this.usePageScroll && this._setAutoHeight(newVal); + }, + autoHeightAddition(newVal) { + this.loaded && !this.usePageScroll && this.autoHeight && this._setAutoHeight(newVal); + }, + }, + computed: { + // 当前z-paging的内置样式 + finalPagingStyle() { + const pagingStyle = { ...this.pagingStyle }; + if (!this.systemInfo) return pagingStyle; + const { windowTop, windowBottom } = this; + if (!this.usePageScroll && this.fixed) { + if (windowTop && !pagingStyle.top) { + pagingStyle.top = windowTop + 'px'; + } + if (windowBottom && !pagingStyle.bottom) { + pagingStyle.bottom = windowBottom + 'px'; + } + } + if (this.bgColor.length && !pagingStyle['background']) { + pagingStyle['background'] = this.bgColor; + } + if (this.height.length && !pagingStyle['height']) { + pagingStyle['height'] = this.height; + } + if (this.width.length && !pagingStyle['width']) { + pagingStyle['width'] = this.width; + } + if (this.maxWidth.length && !pagingStyle['max-width']) { + pagingStyle['max-width'] = this.maxWidth; + pagingStyle['margin'] = '0 auto'; + } + return pagingStyle; + }, + // 当前z-paging内容的样式 + finalPagingContentStyle() { + if (this.contentZIndex != 1) { + this.pagingContentStyle['z-index'] = this.contentZIndex; + this.pagingContentStyle['position'] = 'relative'; + } + return this.pagingContentStyle; + }, + + renderJsIgnore() { + if ((this.usePageScroll && this.useChatRecordMode) || (!this.refresherEnabled && this.scrollable) || !this.useCustomRefresher) { + this.$nextTick(() => { + this.renderPropScrollTop = 10; + }) + } + return 0; + }, + windowHeight() { + if (!this.systemInfo) return 0; + return this.systemInfo.windowHeight || 0; + }, + windowBottom() { + if (!this.systemInfo) return 0; + let windowBottom = this.systemInfo.windowBottom || 0; + // 如果开启底部安全区域适配并且不使用placeholder的形式体现并且不是聊天记录模式(因为聊天记录模式在keyboardHeight计算初已添加了底部安全区域),在windowBottom添加底部安全区域高度 + if (this.safeAreaInsetBottom && !this.useSafeAreaPlaceholder && !this.useChatRecordMode) { + windowBottom += this.safeAreaBottom; + } + return windowBottom; + }, + isIosAndH5() { + // #ifndef H5 + return false; + // #endif + return this.isIos; + } + }, + methods: { + // 当前版本号 + getVersion() { + return `z-paging v${c.version}`; + }, + // 设置nvue List的specialEffects + setSpecialEffects(args) { + this.setListSpecialEffects(args); + }, + // 与setSpecialEffects等效,兼容旧版本 + setListSpecialEffects(args) { + this.nFixFreezing = args && Object.keys(args).length; + if (this.isIos) { + this.privateRefresherEnabled = 0; + } + !this.usePageScroll && this.$refs['zp-n-list'].setSpecialEffects(args); + }, + // #ifdef APP-VUE + // 当app长时间进入后台后进入前台,因系统内存管理导致app重新加载时,进行一些适配处理 + _handlePageLaunch() { + // 首次触发不进行处理,只有进入后台后打开app重新加载时才处理 + if (this.pageLaunched) { + // 解决在vue3+ios中,app ReLaunch时顶部下拉刷新展示位置向下偏移的问题 + // #ifdef VUE3 + this.refresherThresholdUpdateTag = 1; + this.$nextTick(() => { + this.refresherThresholdUpdateTag = 0; + }) + // #endif + // 解决使用虚拟列表时,app ReLaunch时白屏问题 + this._checkVirtualListScroll(); + } + this.pageLaunched = true; + }, + // #endif + // 使手机发生较短时间的振动(15ms) + _doVibrateShort() { + // #ifndef H5 + + // #ifdef APP-PLUS + if (this.isIos) { + const UISelectionFeedbackGenerator = plus.ios.importClass('UISelectionFeedbackGenerator'); + const feedbackGenerator = new UISelectionFeedbackGenerator(); + feedbackGenerator.init(); + setTimeout(() => { + feedbackGenerator.selectionChanged(); + }, 0) + } else { + plus.device.vibrate(15); + } + // #endif + // #ifndef APP-PLUS + uni.vibrateShort(); + // #endif + + // #endif + }, + // 设置z-paging高度 + async _setAutoHeight(shouldFullHeight = true, scrollViewNode = null) { + let heightKey = 'min-height'; + // #ifndef APP-NVUE + heightKey = 'min-height'; + // #endif + try { + if (shouldFullHeight) { + // 如果需要铺满全屏,则计算当前全屏可是区域的高度 + let finalScrollViewNode = scrollViewNode || await this._getNodeClientRect('.zp-scroll-view'); + let finalScrollBottomNode = await this._getNodeClientRect('.zp-page-bottom'); + if (finalScrollViewNode) { + const scrollViewTop = finalScrollViewNode[0].top; + let scrollViewHeight = this.windowHeight - scrollViewTop; + scrollViewHeight -= finalScrollBottomNode ? finalScrollBottomNode[0].height : 0; + const additionHeight = u.convertToPx(this.autoHeightAddition); + const finalHeight = scrollViewHeight + additionHeight - (this.insideMore ? 1 : 0) + 'px !important'; + this.$set(this.scrollViewStyle, heightKey, finalHeight); + this.$set(this.scrollViewInStyle, heightKey, finalHeight); + } + } else { + this.$delete(this.scrollViewStyle, heightKey); + this.$delete(this.scrollViewInStyle, heightKey); + } + } catch (e) {} + }, + // 组件销毁后续处理 + _handleUnmounted() { + this.active = false; + this._offEmit(); + // 取消监听键盘高度变化事件(H5、百度小程序、抖音小程序、飞书小程序、QQ小程序、快手小程序不支持) + // #ifndef H5 || MP-BAIDU || MP-TOUTIAO || MP-QQ || MP-KUAISHOU + this.useChatRecordMode && uni.offKeyboardHeightChange(this._handleKeyboardHeightChange); + // #endif + }, + // 触发更新是否超出页面状态 + _updateInsideOfPaging() { + this.insideMore && this.insideOfPaging === true && setTimeout(this.doLoadMore, 200) + }, + // 清除timeout + _cleanTimeout(timeout) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + return timeout; + }, + // 添加全局emit监听 + _onEmit() { + uni.$on(c.errorUpdateKey, (errorMsg) => { + if (this.loading) { + if (!!errorMsg) { + this.customerEmptyViewErrorText = errorMsg; + } + this.complete(false).catch(() => {}); + } + }) + uni.$on(c.completeUpdateKey, (data) => { + setTimeout(() => { + if (this.loading) { + if (!this.disabledCompleteEmit) { + const type = data.type || 'normal'; + const list = data.list || data; + const rule = data.rule; + this.fromCompleteEmit = true; + switch (type){ + case 'normal': + this.complete(list); + break; + case 'total': + this.completeByTotal(list, rule); + break; + case 'nomore': + this.completeByNoMore(list, rule); + break; + case 'key': + this.completeByKey(list, rule); + break; + default: + break; + } + } else { + this.disabledCompleteEmit = false; + } + } + }, 1); + }) + }, + // 销毁全局emit和listener监听 + _offEmit(){ + uni.$off(c.errorUpdateKey); + uni.$off(c.completeUpdateKey); + }, + }, +}; diff --git a/uni_modules/z-paging/components/z-paging/js/z-paging-mixin.js b/uni_modules/z-paging/components/z-paging/js/z-paging-mixin.js index 9d09cafa..e4a7e141 100644 --- a/uni_modules/z-paging/components/z-paging/js/z-paging-mixin.js +++ b/uni_modules/z-paging/components/z-paging/js/z-paging-mixin.js @@ -1,22 +1,22 @@ -// [z-paging]使用页面滚动时引入此mixin,用于监听和处理onPullDownRefresh等页面生命周期方法 - -export default { - onPullDownRefresh() { - if (this.isPagingRefNotFound()) return; - this.$refs.paging.reload().catch(() => {}); - }, - onPageScroll(e) { - if (this.isPagingRefNotFound()) return; - this.$refs.paging.updatePageScrollTop(e.scrollTop); - e.scrollTop < 10 && this.$refs.paging.doChatRecordLoadMore(); - }, - onReachBottom() { - if (this.isPagingRefNotFound()) return; - this.$refs.paging.pageReachBottom(); - }, - methods: { - isPagingRefNotFound() { - return !this.$refs.paging; - } - } -} +// [z-paging]使用页面滚动时引入此mixin,用于监听和处理onPullDownRefresh等页面生命周期方法 + +export default { + onPullDownRefresh() { + if (this.isPagingRefNotFound()) return; + this.$refs.paging.reload().catch(() => {}); + }, + onPageScroll(e) { + if (this.isPagingRefNotFound()) return; + this.$refs.paging.updatePageScrollTop(e.scrollTop); + e.scrollTop < 10 && this.$refs.paging.doChatRecordLoadMore(); + }, + onReachBottom() { + if (this.isPagingRefNotFound()) return; + this.$refs.paging.pageReachBottom(); + }, + methods: { + isPagingRefNotFound() { + return !this.$refs.paging; + } + } +} diff --git a/uni_modules/z-paging/components/z-paging/js/z-paging-static.js b/uni_modules/z-paging/components/z-paging/js/z-paging-static.js index dbd02bca..fb46d113 100644 --- a/uni_modules/z-paging/components/z-paging/js/z-paging-static.js +++ b/uni_modules/z-paging/components/z-paging/js/z-paging-static.js @@ -1,13 +1,13 @@ -// [z-paging]公用的静态图片资源 - -export default { - base64Arrow: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAD1BMVEVHcExRUVFMTExRUVFRUVE9CdWsAAAABHRSTlMAjjrY9ZnUjwAAAQFJREFUWMPt2MsNgzAMgGEEE1B1gKJmAIRYoCH7z9RCXrabh33iYktcIv35EEg5ZBh07pvxJU6MFSPOSRnjnBUjUsaciRUjMsb4xIoRCWNiYsUInzE5sWKEyxiYWDbyefqHx1zIeiYTk7mQYziTYecxHvEJjwmIT3hMQELCYSISEg4TkZj0mYTEpM8kJCU9JiMp6TEZyUmbAUhO2gxAQNJiIAKSFgMRmNQZhMCkziAEJTUGIyipMRjBSZkhCE7KDEFIUmTeGCHJxWz0zXaE0GTCG8ZFtEaS347r/1fe11YyHYVfubxayfjoHmc0YYwmmmiiiSaaaKLJ7ckyz5ve+dw3Xw2emdwm9xSbAAAAAElFTkSuQmCC', - base64ArrowWhite: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAElBMVEVHcEz///////////////////+IGTx/AAAABnRSTlMA/dAkXZOhASU/AAABYElEQVRYw+2YwXLCIBCGsdAHWGbyAKZ4zxi9O017rxLf/1UaWFAgA1m8dcpedNSPf/l/Vh0Ya/Wn6hN0JcGvoCqRM4C8VBFiDwBqqNuJKV0rAnCgy3AUqZE57x0iqTL8Br4U3WBf/YWaIlTKfAcELU/h9w72CSVPa3C3OCDvhpHbRp/s2vq4fHhCeiCl2A3m4Qd71DQR257mFBlMcTlbFnFWzNtHxewYEfSiaLS4el8d8nyhmKJd1CF4eOS0keLMAuSxubLBIeIGQW8YHCFFo7EH9+YDcQt9FMZEswTheaNxTHwHT8SZorJjMrEVwo4Zo0U8HSEyZvJMOg4RjnmmRr8nDYeIz3OMkbfE/QhBo+U9RnZJxjGCRh/WKmHEMWLNkfPKsGh/CWJk1JjG0kcuJggTt34VDP8aWAFhp4nybVb5+9qQhjSkIQ1pSEMa8k+Q5U9rV3dF8MpFBK+/7miVq1/HZ2qmo9D+pAAAAABJRU5ErkJggg==', - base64Flower: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAKlBMVEVHcEzDw8Ovr6+pqamUlJTCwsKenp61tbWxsbGysrLNzc2bm5u5ubmjo6MpovhuAAAACnRSTlMA/P79/sHDhiZS0DxZowAABBBJREFUWMPtl89rE0EUx7ctTXatB3MI1SWnDbUKPUgXqh4ED8Uf7KUVSm3ooVSpSii0Fn/gD4j4o+APiEoVmos9FO2celiqZVgwgaKHPQiCCkv+F99kM7Ozm5kxq1dfD91k9pPve9/3ZjbRNHHok/mKli4eIPNgSuRObuN9SqSEzM20iGnm0yIbqCuV7NSSSIV7uyPM6JMBYdeTOanh/QihJYZsUCSby+VkMj2AvOt0rAeQAwqE3lfKMZVlQCZk1QOCKkkVPadITCfIRNKxfoJI5+0OIFtJx14CMSg1mRSDko7VAfksRQzEbGYqxOJcVTWMCH2I1/IACNW0PWU2M8cmAVHtnH5mM1VRWtwKZjOd5JbF6s1IbaYqaotjNlPHgDAnlAizubTR6ovMYn052g/U5qcmOpi0WL8xTS/3IfSet5m8MEr5ajjF5le6dq/OJpobrdY0t3i9QgefWrxW9/1BLhk0E9m8FeUMhhXal499iD0eQRfDF+ts/tttORRerfp+oV7f4xJj82iUYm1Yzod+ZQEAlS/8mMBwKebVmCVp1f0JLS6zKd17+iwRKTARVg2SHtz3iEbBH+Q+U28zW2Jiza8Tjb1YFoYZMsJyjDqp3M9XBQdSdPLFdxEpvOB37JrHcmR/y9+LgoTlCFGZEa2sc6d4PGlweEa2JSVPoVm+IfGG3ZL037iV9oH+P+Jxc4HGVflNq1M0pivao/EopO4b/ojVCP9GjmiXOeS0DOn1o/iiccT4ORnyvBGF3yUywkQajW4Ti0SGuiy/wVSg/L8w+X/8Q+hvUx8Xd90z4oV5a1i88MbFWHz0WZZ1UrTwBGPX3Rat9AFiXRMRjoMdIdJLEOt2h7jrYOzgOamKZSWSNspOS0X8SAqRYmxRL7sg4eLzYmNehcxh3uoyud/BH2Udux4ywxFTc1xC7Mgf4vMhc5S+kSH3Y7yj+qpwIWSoPTVCOOPVthGx9FbGqrwFw6wSFxJr+17zeKcztt3u+2roAEVgUjDd+AHGuxHy2rZHaa8JMkTHEeyi85ANPO9j9BVuBRD2FY5LDMo/Sz/2hReqGIs/KiFin+CsPsYO/yvM3jL2vE8EbX7/Bf8ejtr2GLN65bioAdgLd8Bis/mD5GmP2qeqyo2ZwQEOtAjRIDH7mBKpUcMoApbZJ5UIxkEwxyMZyMxW/uKFvHCFR3SSmerHyDNQ2dF4JG6zIMpBgLfjSF9x1D6smFcYnGApjmSLICO3ecCDWrQ48geba9DI3STy2i7ax6WIB62fSyIZIiO3GFQqSURp8wCo7GhJBGwuSovJBNjb7kT6FPVnIa9qJ2Ko+l9mefGIdinaMp0yC1URYiwsdfNE45EuA5Cx9EhalfvN5s+UyItm81vaB3p4joniN+SCP7Qc1hblAAAAAElFTkSuQmCC', - base64FlowerWhite: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAElBMVEX///9HcEz///////////////84chYNAAAABnRSTlP/AGzCOYZj5g1nAAACfklEQVRYw+2YTVPDIBCGtza9Jw25a0bvcax30o73OOr//yvma2F3YWlpPTijXNpAHrK8LLALVPFium2vNIFSbwGKTGQA2GUiHcD29yDNy3sMIdUBQl7r2H8mOEVqAHgPkYZUS6Qc2zYhQqtjyDZEximCZwWZLIBeIgYShs2NzxKpSUehYpMJhURGb+O+w5BpMCAREKPnCDHbIY20SzhM5yxziAXpOiBXydrekT9i5XDEq4NIIHHgyU5mRGqviII4mREJJA4QJzMiILwlRJzpKxJKvCBm8OsBBbLux0tsPl4RKYm5aPu6jw1U4mGxEUR9g8M1PcqBEp/WJliNgYOXueBzS4jZSIcgY5lCtevgDSgyzE+rAfuOTQMq0yzvoGH18qju27Mayzs4fPyMziCx81NJa5RNfW7vPYK9KOfDiVkBxFHG8hAj9txuoBuSWORsFfkpBf7xKFLSeaOefEojh5jz22DJEqMP8fUyaKdQx+RnG+yXMpe8Aars8ueR1pVH/bW3FyyvPRw90upLDHwpgBDtg4aUBNkxRLXMAi03IhcZtr1m+FeI/O/JNyDmmL1djLOauSlNflBpW18RQ2bPqXI22MXXEk75KRHTnkPkYbESbdKP2ZFk0r5sIwffAjy1lx+vx7NLjB6/E7Jfv5ERKhzpN0w8IDE8IGFDv5dhz10s7GFiXRZcUeLCEG5P5nDq9k4PFDcoMpE3GY4OuxuCXhmuyNB6k0RsLIAvqp9NE5r8ZCSS8gxnUp7ODdYhZTqxuiJ9uyJJtPmpqJ7wVj+XVieS903iViHziqAhchLEJAyb7jWU647EpUofQ0ziUuXXXhDddtlllSwjgSQu7r4BRWhQqfDPMVwAAAAASUVORK5CYII=', - base64Success: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAElBMVEVRUVFHcExTU1NRUVFRUVFRUVFOSlSUAAAABnRSTlP/AI6+VySB3ZENAAACcElEQVRYw+2YyYKCMAyGI8hdpdxdZu7gcpdZ7jL6/s8yYheSNi0aPdqbwOffpGmaFOYPD3gj4bisN7vddv17N/JVgxn5x12IWgIaWTuO/IE3PseQbwjGPo2cgRmHFLJwdm/X643zwiqOKPPJ1nj3sjEP2iiifZWj5bhopSyGaEO2HX5fbQJzwJ+W7x/jw5ZFjsEU0PMph9xE8i5EqprKALW95eJQURkgzw98uJ/JvwGecR7bIjWWsUgVrrIfFZ2HlLy3sKETD1mmRLRMRhGVssRa0xJkdn3SpJBymBkM8+pSSDXMDNyDaToVHd2fgpNt0sjwiUZO19+jGQ+gQEg9Oq+bufmAVGihomNmjQG7UG3020vrlm7lkFnKFGU3kZ0KGAdmKe821pipQ+qEKcrZeTL2g5FsUks4cStjEZWwXg0b0n4GxmEpkWwIs5VBynjgK7xZaz1/0D7OxkVuLpsY5BQNFyLS84VBjjbg0iL2r2EQHBOxBhikuUOkdxODVF1cxHoWtPPsiyXO455Iv34hssCO8EV4ZIYTjS8SR4qYSHRiTiYQ4ZFbHi0iIhhBTi6dTCgSWRcnw4h4yGTuyTAiOGBIWGoZTgSHJQl+LcOJ4OCnW6yX2bMnJ9pidCOXtkTkTrIGpYuOynAiOF14SamMiOCk5Ke+mq8BcOrrvym8d0zKIQnWT+M1WwOQNO4fFiWb18hhERxJPx2fblbPHHyC41VyiAtKBUFBIih7JMWVoIQTFIr3lKPN80WvoLSWFPC653ioTZA0I0FrQ7qU6asaK0H7JmkSJa2ooOGVtNUsc3j9FYHkIkJy3SG6VHnfXKXGP9t4N9Q4Ye98AAAAAElFTkSuQmCC', - base64SuccessWhite: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAGFBMVEVHcEz///////////////////////////8dS1W+AAAAB3RSTlMAiVYk6KvDHLfaegAAAo1JREFUWMPtWEtzmzAQNhCTq910ytXpiyvxTNOr60zrayepx9d02gnX4sTm7xcEiJX2gdnkGJ1A4tOnfWqXyeR1vMRYzrcPD9v5h5MBl3/Ldvx4cxIg/FWC8X0xjLjalM54uhhCfCrRuJURX0pi3EmIqZV7O59vrRZmguStHL9b7S7ftfLwOtiZDw7AHMtmquAQ12b5Wwbnordm8g9zLLO49qc/m2n6aKnhwPOGZ08hAiNHhheiHae1lOUPGZpQkPKa3q0mOUjaRzSRaGUjpy/mmWSwySSpllcEteBKAT52KEnSbblA51pJEPxBQoiH1FP4E3s5+FJv07h6/ylD6ui7B+9fq/ehrFB98ghec9EoVtyjK8pqCHLmCBOwMWSCeWFNN4MbPAk55NhsvoFHSSVR0k5TCTTEzlUGcqV/nVp7n9oIVkmtaqbAEqEgfdgHJPwsEAyZ9r4VAZXFjpEwyaw3+H2v42KYxKhs1XvY/gSSGv+IHyUSuHXCeZhLAgVI3EjgSGo1Fb3xO0tGGU9S2/KAIbtjxpJASG73qox6w5LUq0cEOa+iIONIWIilQSQ0pPa2jgaRQAgQP7c0mITRWGxpMAmEQFN2NAQJNCV0mI6GIIEO47hlQ0ORQLd0nL+hoUjg1m6I1TRr8uYEAriBHLcVFQ5UEMiBe3XkTBEG04WXlGKGxPnMS305XQPA1Ocn2JiuAZwE66fxnKwBnDTuXxZTMq85lwW6kt5ndLqZPefiU1yvmktcUSooChJF2aMprhQlnKJQ5FxRKkcVRa+itNYU8Io2oVkY14w0NMWYlqft91Bj9VHq+ca3b43BxjWJmla0sfKohlfTVpPN+93L/yLQ/IjQ/O5Q/VR5HdL4D7mlxmjwVdELAAAAAElFTkSuQmCC', - base64Empty: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAACWCAMAAAAL34HQAAALeGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDIgNzkuMTY0NDg4LCAyMDIwLzA3LzEwLTIyOjA2OjUzICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIyLTAyLTIyVDIxOjIxOjQ1KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDI0LTAxLTEzVDE5OjA5OjQwKzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNC0wMS0xM1QxOTowOTo0MCswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ZWQwMWYzNWQtOWRjOC00MDBiLWEyMmQtNjM5OGZiNzVhNGRiIiB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZDhlMzQ3ZmEtMDY2My1jYTRiLTgzNTctNTk4YjBkNGIzOTU2IiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6ZDA4MDI4MDItMzUyYS04NTRhLTkxYjctNmRlNmQ1MmViM2QwIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiIHRpZmY6T3JpZW50YXRpb249IjEiIHRpZmY6WFJlc29sdXRpb249IjMwMDAwMDAvMTAwMDAiIHRpZmY6WVJlc29sdXRpb249IjMwMDAwMDAvMTAwMDAiIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiIGV4aWY6Q29sb3JTcGFjZT0iMSIgZXhpZjpQaXhlbFhEaW1lbnNpb249IjMwMCIgZXhpZjpQaXhlbFlEaW1lbnNpb249IjMwMCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZDA4MDI4MDItMzUyYS04NTRhLTkxYjctNmRlNmQ1MmViM2QwIiBzdEV2dDp3aGVuPSIyMDIyLTAyLTIyVDIxOjIxOjQ1KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQwNjg2NzJkLWY5NDMtOTU0Mi1iMDBiLTVlMDExNmE1NmIzZSIgc3RFdnQ6d2hlbj0iMjAyNC0wMS0xM1QxMDoyNjoxNiswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDphYmJkZmUyZC0xY2Q2LTJiNDgtYjUyNS05YzlhZjdlNjA4NDMiIHN0RXZ0OndoZW49IjIwMjQtMDEtMTNUMTE6MjM6NDArMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvcG5nIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6YTQ5MjM5MDAtNDhiZC03YTQ1LWI4NGItYmVlZTVjOWUxYTM1IiBzdEV2dDp3aGVuPSIyMDI0LTAxLTEzVDExOjIzOjQwKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmVkMDFmMzVkLTlkYzgtNDAwYi1hMjJkLTYzOThmYjc1YTRkYiIgc3RFdnQ6d2hlbj0iMjAyNC0wMS0xM1QxOTowOTo0MCswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjAgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOmFiYmRmZTJkLTFjZDYtMmI0OC1iNTI1LTljOWFmN2U2MDg0MyIgc3RSZWY6ZG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjM2ZGQ4NTQxLWQ0MWEtYmY0Yy1iZjA3LWNmNjZhNjZhMDg2MSIgc3RSZWY6b3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmQwODAyODAyLTM1MmEtODU0YS05MWI3LTZkZTZkNTJlYjNkMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pm30U/gAAAAJcEhZcwAALiMAAC4jAXilP3YAAAA/UExURUdwTODg4O3t7e7u7unp6d7e3uTk5M/Pz8nJyePj4+jo6Pj4+MrKyszMzO7u7unp6fb29vLy8vr6+v7+/sHBweag3xAAAAAOdFJOUwAxia5pF0n+/vzX3KbULQ2DYQAACG1JREFUeNrtm4l2o7gShi20IWFrAd7/WUc7EosDWKZ976Hc7WTmdMKXv0qlqpLyeNx222233Xbbbbfddtv/mOHn8xexSNsiRH5PrbFtW4p+DetpsF4v8Gs+HA3WEwOAfwzriYxaLTVsP8X1QK0z+vqQCzewYogi60aL9SEX5oyxphYVCFTGjfSJCTmN1jBruN5KTGCUS8bhySQGHRaohmW4glwtldbOeYJYKlgvbyUuA8aFFEKc++aIM4hrRnyiMnIZKq1PrihcM3GNKboMF1Naa9X9+8T1KrxIlVbGjv3cAEHOYYMqqgUsVuJqqehV3+sjDwB+DTJp0lYtMCyZpxqjF4e+74+sRcQSFZO8UonUSEFzuUY+DKo59A2kZDatGCjzCauy/2AmhSyCq0WHEj0KTNJDmVeNhErMt1Q8W4xti4/FwMJ4jaxl05TKFiNtD3kBGrHnhiph9V0eXQc6DkyE2xX830AlKshFTErXeuCZXK/9m41wFsGSfZ4lcGeyZ98PrylJ7MWCojQZ3qSukL2QslgdngqJnTEPdTJhXvbNBoR/+7wabIxWduN/Ja5dWEivm4XSZ2uQckNzmRlHrn2lc6eiafvS4V2Hd12tesau8toZW0CtWoZYb9t+OqxdCYKYjVPF16pVbILIy/gR7MVaWMHYPCoa2VkzkX4Iry2rirXbumGyAjGC1h62YLw6ApsNKZph3fpIWHt08JovRWD62sejpXhTrhWrPpl6zZ6PW2oTG5ltlvgtF6weNYCWKeJJSfg4W6PNJlj3sVZgOXV4lc8n4RlkMTLEBDVoYc3nI09kpyzzfgWsjyzBZSNDKF2/wjh+sxYvn8Y1scxlfLF9T1RBO3wVHsnq8Fk4oGkEh/0KJPSa8T2CeWE5X9BPmgLsaRIGeNL2kshCsWoLBmdPJW5Wbz1ndAKUXjPwxXYAUpSV3fy5BJg1aa1tyVXHHMgVH31ewDVrleHr9XqC684SUF4mecR3+wW5SC2QNvxUizRv98mLDhPgYiMDb+v8g0OADxqxcnf9w01mZYJF0fUVP5LcdswbsMmy1DVs5PlE5NpNiTR8M8qAWZkOy6aN13VcoOF2/s3xn3Mes8Xza05tgR/BuNz69nlNzMR0fH45p+G4R9oxh2mKt9MF4J7K/lvWUojwF5nCgCpuRUptnZMQ3au0nSo2UsHgV3xpmeLYzGml3ZFBBzYGPCpOQRwXs1/GG1J74dlZc6JKUOtjBAz9XjVxucGWHbZVJDPJQGYDRl1Qmf1ovk2Sbghb6MQlnF7mBzM1bgOqJAPpoOQaVe+4Skcit3uqHMyG/Sh1rHNN0gAfM0nnPrmulfLVBSm20TSZSdWa0LJl2ukVyE4vTYCgP3uQkwv1TKtQWgxDzBSg80OQjCs4klKvuUzHLCfIbDKIE/S5VIGqD1iD2819pkAqTWdmeina+oZABi7X5B1MGoTJqJSchuk6JNHcgUPAcsVFk0+N0oDN68Vo7FQSmCXjx46OEtUk1lpY2ZFQGr/AcpqVato4wPUD+RhfAeyQI5sJ6l2sDwnKqNFSJvpiyJbFl3kTOjZ2ievwCR7hkUoWeV2vOLAXvB39AJoyqYa81A5cvaAidXYTFTycKDBcalVK5f3XS89kzLVl9txfL+K+p6NUnitz5KkKm7D3DrRPNq4bk7l20aFRppNilmuQI+uzTtj9wPBkTsVwM7HbJ5pwGgujyRyZDzQLNoiRFluRtQ+GzEguqRxUL+ZMFqulMzIfaP3ARj2k/txB8c+2HyjmDizCaVWtNoE5MvMlKs/4VQ7HUJZCrU6qCKcNJ2aSWUZhJZu4VI0LB4CHFdj77DRuGi28WKAxoRyZyzGVrmc0jmk1nP5QaxZo1puqq1YIAqgZb8e/rABZJWNCNxV7DSTpOO7Aail9J9nYHtua/4ouE/aS0X1qtXQzwGx+rnbi2vhF/TfZG52oc6DPo1WCi3RTDnRk7TEntoEp38gg+DjYs2opkR3JW5EpL9rU0XSK5/6LOTAVS+72x7pm60zSf5HMdldjhzJqw1FRcxXdS3ZNZp0s92FiyluUvBPoD9ynZNkBiu2NF11ofnlnQbZgKqvusj9R/f6DOzgVsahbNlXxlsxU8y7qrbTupitRyxFBKG6H3aEPUqj7YrzAymq41FXlZLlO4WLbvG2Kg4vYB+wPfWS2B5Rq8TW9ROpAZbiF6MmCTsx1NLLsx7NOoOiZup2CNbZ36xc96ErcxzuILGrmmFhimjtwKo/yTm7feTVwB61IzbnW4967Kt3cDDotGt8JKrTiUyO3Uy2PZZt9tapXEfXhWmTgcoB+JchFWsiCKvYnhmn/tKuJDbgly897FnFfkE1rQLKy810OU7xW3bEJHCD5gERtuTGuxoJqA6qI9TNMa6MbvZomsiubbPYx78YXDaaRqqsyqfSaLZdjYGHLu65rDgydXCWm1P5EvcQ828f9pcBapTILSMv1nZCAc0WzFIFsGfUi/kmAxc6cFqDSYuPSMIbs1OVrwITTQM9HVRFJ5JL56qcoFzzT1uVcd2v9jFw8BHlcWtmEI86hp5Dy/zOlK8cUp/rVseRUBqawz6kmAcPLM9l5m8h4V53Iz/2mFJaTCvF8JbsMvPjU/7crbUXart0v4WyE0LnDPcAX95Knj4VUE8HCdNdUP8BDcOXKdPl4uSWbh4LfOV0HDdfipOmu+eIRrDsNPkIT7np/8ZAzVdOd1u8wHIqeXt8VqtgiO50ePeNaGG+uO9rHiKdL71pnIun8jxEKXv2r2HYBzO/mz96vFKoMM5WLk7tQXS9U5kwCu5lk7n6++kdCFWRaTUzm0/5fClWGWTrM/AGhCrJO/ZBQhTPFLwmV7ebgcdttt91222233Xbbbf+H9h+2WEtdHVinLAAAAABJRU5ErkJggg==', - base64Error: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAACWCAMAAAAL34HQAAALeGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDIgNzkuMTY0NDg4LCAyMDIwLzA3LzEwLTIyOjA2OjUzICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIyLTAyLTIyVDIxOjIxOjQ1KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDI0LTAxLTEzVDE5OjEwOjEwKzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNC0wMS0xM1QxOToxMDoxMCswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTQ3NTExNjAtZDY5MC00ZTkzLWFhNGUtNGMwYTViNGU1ZGFjIiB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6YzRiNzlkYWMtZTJmYS1iNzQ0LWIxM2ItOWU1N2VjMDhhM2YwIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6ZDA4MDI4MDItMzUyYS04NTRhLTkxYjctNmRlNmQ1MmViM2QwIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiIHRpZmY6T3JpZW50YXRpb249IjEiIHRpZmY6WFJlc29sdXRpb249IjMwMDAwMDAvMTAwMDAiIHRpZmY6WVJlc29sdXRpb249IjMwMDAwMDAvMTAwMDAiIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiIGV4aWY6Q29sb3JTcGFjZT0iMSIgZXhpZjpQaXhlbFhEaW1lbnNpb249IjMwMCIgZXhpZjpQaXhlbFlEaW1lbnNpb249IjMwMCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZDA4MDI4MDItMzUyYS04NTRhLTkxYjctNmRlNmQ1MmViM2QwIiBzdEV2dDp3aGVuPSIyMDIyLTAyLTIyVDIxOjIxOjQ1KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQwNjg2NzJkLWY5NDMtOTU0Mi1iMDBiLTVlMDExNmE1NmIzZSIgc3RFdnQ6d2hlbj0iMjAyNC0wMS0xM1QxMDoyNjoxNiswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpjZjk1NTE1OC04MjFiLTA4NDUtYWJmNS05YTE1NGM1ZTY4NjEiIHN0RXZ0OndoZW49IjIwMjQtMDEtMTNUMTE6MDQ6MDQrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvcG5nIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZGM1Y2IyNWItZDZlNC0yZjQ2LTgyODQtZmUwOTNlY2M2ZTkxIiBzdEV2dDp3aGVuPSIyMDI0LTAxLTEzVDExOjA0OjA0KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjE0NzUxMTYwLWQ2OTAtNGU5My1hYTRlLTRjMGE1YjRlNWRhYyIgc3RFdnQ6d2hlbj0iMjAyNC0wMS0xM1QxOToxMDoxMCswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjAgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOmNmOTU1MTU4LTgyMWItMDg0NS1hYmY1LTlhMTU0YzVlNjg2MSIgc3RSZWY6ZG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjM2ZGQ4NTQxLWQ0MWEtYmY0Yy1iZjA3LWNmNjZhNjZhMDg2MSIgc3RSZWY6b3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmQwODAyODAyLTM1MmEtODU0YS05MWI3LTZkZTZkNTJlYjNkMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Ph2LDQsAAAAJcEhZcwAACxMAAAsTAQCanBgAAAA5UExURUdwTNra2s7Ozq2tre3t7dPT087OzuPj4+3t7dbW1u/v79bW1vz8/MrKytDQ0Nzc3MPDw/X19bi4uMZQDnEAAAAKdFJOUwBqEPywotz+wzqApqiTAAAHW0lEQVR42u1b25akIAwcbx2UFoj//7HLTQVBRcSZfTDnbM/uTl/KSlEkwf75eeONN95444033njjjTduR9/0/yOsbqoevObL7101tYX1HFs9QFtfZalRP+rpQVgdAFx990ZnT8L6eZItUl99jeGpf1DxdV/VP9fV1f/PFlF1bYHoVFSRC60IyVjrFRnuB8IoxpExSrstsErKHpJw1eqybNLbAQvAYkKjUrjoBgKRqAaeIjG5+qaps6hKcMWmcdSwqAJWBbAgCZZaIYbsqggqqlHNbFFa5yVR4jKvrKEErOEjNCqNSwHrfE8lpLsod/u+cOPPMPBJ+Gz5dM0cXNgclre+pSxhYI1WW5Tf9ENSMIdLCiWs6q9hwQprBVYKFqyPlx4WtoSvrT9lC/wkGt8qlkQooC3hi6sgW3Bb8gtdpSV/za/mn49pC0oYhONbfyd5hzDLFivKFpTS1gKM0we0tQCEncfgQn7Rt+DC/299i1MSRJcBC0r7VviG5KZvwV5WIUobxHyrJKy8VRjXVgFYsPu5kOtbxdhycCDuihziXVLoW7xwEiUmDgd544B46luWLW+nugMLB2BimmC3cxTNxCDg8xFtuUSNqoFsDKzY8psa+XtBNWXr74N6qxwsS5T6VL5robKl10+ZRu5S9qBvUYuJwVHzjwjrE3G33qKh+WXBgmkmCvHYquTvZ8oo7rLFA4PJgYW0MdePIRQIGUPNbSMw5lubJMKtJI6+Wk6cVFMmACO+VVryeL7ZgI8MhwS2fnNPPK0geHBRd11eJSiyL4KjrL2umm1XIpRii1MKB/mU/iCZwF+pt5z3UJ7UiF3nQqadAXC3T3xEW2IyuDBe3yDTe0+A64it2WTyYSGVHymUI/EduvSWKJ80Dtv2NbYSoQxbMkVC7yzNGIWFvDF7gRD79RYrWW/BDGti4wwLtgvO7gWKUZ8Mt94qX8vLJE70+xVNwzDm9ghNM+FX7p/jlZUId2HJD+Tf79hMe3WNrAK/30E+C8/6xOCqbqxE5JNMYrNbnaLUvJAewfCg8zF0Ba/tbviWLvPYfsGFA1PVD8ZdnjlVc/DS/o7LK4NHjOjKKbfCTSCo5XmwKbaZM4jlc9NGEYd9Ijd0QS5ZGaOR2O+DPlGyRb2nXZzgnI1GdFWF+0gh3ifyTRqvzpXI2eElk58FeHziCF5hY+hSMV9Ge/mohUTGuQ4vzHYe8bW5sNdFQ58St22Vcf5zzJbtcGT4iYQ7iz8dFuxoWRYMjAM7KCnypHOTLSqdUwYIFpndOD/6B2FBzNQxYmW/zxYE4j8yLHga1s2Rbm/O5PXtGcuNDIW1dTj5hpjGsO+7z2Kk9NP1JWDlnWKAM4H6zCUNM05KyVPHBclYzUbgjE3N3tP2JWHBmbqD4GLeCs2jhMT13lMVljwcEbetwZgtHUxVQ21ho3fE7inf2s8vzMWq0EWpfOBg5hcDSGwaF2+LaysRIzNFqRgBv2sMhi/Ix0WiW8rBKNBv4ExBI7eorx9ANazsPCb5FkSNH+Reacos+AYxaFzX76KMH65c8ytzZ40YvpFAqtgC/otn1eCmMI5K8yVRQVVwq3aVtU+jJktwjyP7x+BKv8vtoH098vXYSJcrWGJcAW11r8WVRxe5vgcuFbXqwnaEZejS6mrLwYKUg1ch2RJswTFYgMOwoau+AQsSp/FuDhVZi7J402ifgGla/GJIzGLYG5H4rnKMCUydL9wcsmZSuPikR2QmjQbWqaV2ob2RdMvaLEvFlRiXpYeTwqVOtMZF+qi0dS4uEjJKMvWuYK3S0jHZwaq7BylYp/O2uu3q04lNqudLWEJQd/3paTBz12IaLIPtzE5P1AUuW9TB8NVzaG9/TIfV+eXsWeezz6HWlptEbo4SIAeWur/Y/RZC/gmZTiLzUY2j5ct6fjKsFvxqgyQxE9sbmfYtnJMIciEKo6+FL0wziJmtkzspIcUl0PgWrL7VCKP7hl61U4WLeN+7Ieli2vZhmq0VgjDOgIyhJ62sSpDkWNZa1wiB8WoLlxzy29XpGVPgn1ut5VYcGyRLK7OCiJaDYMrAneJUkZWdw0yDgNm5nDowqLc0Kp581FO7QS4pC9S/YRW9xkVdNOj0ZHCp9anEZw3VEK/fopiDrkMObkcdJtT1g6+uzQ60bIdUPztdWZWy53m+v/zFYPOGHO4AZsalmtJNkyHrCAx1RXX7mt5g1L1pDezpkXv8wJwpVRSSaf2c26Y0rrXXxyWBptu/ovdak+VhkqjGBZUdvKygqANKA/MqZ/36kcGwFn90RnWp66ksKuHgitLFY8BU+F2ZvqpxpMY9qR3YwOUJ12fc0KUHVKdswcKXuwetErCnwvMKuXxfc/3RVJ2yFc+iosQd3X+WGSVz1UiuN2J156FyVyHbsOUp3krezaPUT/VxXqdfwvknb/Zgp+idTxTbrkLqYuKreRnhy65Gf4W0NsDoYiqf6uZsvr8V9eo6XWc5+3TVf/3N1TfeeOONN95444033njjjTfeSI1/IeOYOeO4fGAAAAAASUVORK5CYII=', - base64BackToTop: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADIBAMAAABfdrOtAAAAElBMVEVRUVH+/v5HcEyZmZlRUVFRUVGm1ByOAAAABnRSTlPMzADMTZAJBBGsAAAEnElEQVR42t2cS27jMAyGf7/2U+QCQeDsbeQCgZDujaC5/1UmkzaJn+JDFGcw3LdfflKibJkkDnxrL7dbg7sNt6+L4O8OYBM+B0ys+QrGkHZG+OEEQ8g6go8Bx1GIGMdpNOQyIG6XdMgnSPtKhLQDGEZFBgYMkhKFtGBb0EIEjDgFRowoBVaMGAWpMedEfxMiZtwpUsgZCqtlkCNUdpVAWigtCCCDFtLwIWeoreZCWiRYYEKGFEjDg+yRZCUH0iLRAgNyToXUNCRZyMqWhGnUN2IPm3wSlwJ7IUspyCBkIQUZhCykIIeQuRTkEDKXAuM9srrtYbrZN7Y98giZSoFd+t1OxmMITG0dcrSFXFchZ1tIvQZpYWxhBbK3hpQrkMEa0iwh5t4a+QvZvDXyF7J5a+Qv5PPW21/I5623v5DPW29/IaO3Xv5Clrw1y1/Ikrdm+Qs5svw83yNnSJ5BQb4F/F7EIEJSnThGBAXxkFQfLOviQUE8JAUPsosHBfGQfDAtHhREQ1JxIV00KIgmrnRI84S0yAd5BAXxxJUck0f6Qnwr9qmr6xF5xLMjcwn/iudIEAdWnyjkEXlQKZiRVzoqRyLbgeUKKR8Q4alY7cSnoxzSf2ggsqehKr6YVpcXpOd7H93f60cKhOd7Re2LteUF4eLqiVS1mr0ge4io6C2+soaFkJ7MuuuQs1yITEp9hwwKISIpzR2iESKSIoT0rLNwuVHQqoSIpAQJpGce60vIUSdEIuUqgPTsJ5QFZK8UIpBS8iG94GFrDjlrhfCl8CG96Llxmle4kEr6vKWBPIVo9kqDQSRk9/3cWoikcCFPAd33v4dIChPyEvLzBA6RlEYWke4JEUnhKXkLeUEKxRHJFfKCQHGucIW8IdZSRkLeEGMpYyEjiK2UsZARxFTKRMgYYillImQMMZQyFTKB2EmZCplAuFLIHT8TMoWwpQwiIVMIUwqpZP5bp5CCvCTiQKr5f5lCQN+tPCBn2ZvVDFJwIDUP0m1BYAfZYRNSsCB7BqTbhoARePIxtZ9tgwWkoJcwCalmv3MBAemtO4R6dah2HaKQqj8Zvp9sQDjvJ21+SPCBHPJDDk6QITekEV7gqCC19CpKAym9IMfckKv4olMBCeIrWwVEfvkshzQekO9r9P1/ALk+IG1eSPCDiCJfyG+FyU+A6ZCa/piZDinpz7LpkCv5gdkAEshP5emQhv7onw6pGeULyZCSUYiRDAmMkpJkCKs4JhFSq8p8hJBSVbAkhARV6ZUQoisik0FqXTmcDHLVFfbJIEFXoiiCNMpiSxGkVJaNiiBBWQArgTTaUl4JpNQWJUsgQVteXQg+AKkLxQWFGKW+5J2+eVp4S168X3CF1CltCKdTJ8lb84YK2bUBO+wZW0Pqv9nk4tKu49N45NJC5dMM5tLW5tOg59Jq6NM06dL+abFXwr/RkuvTXJwae1abtE/Dt0/ruksTvs84AZ/BCC4jHnyGVfiM3VBQFANEXEah+Ax18RlP4zNox2dkkM/wI58xTn8yDCXGYCDV3W5RGSajtXyGhG1jbpbjzpwGt/0MJft8jqC7iUbQ/QZaxdnKqcIftwAAAABJRU5ErkJggg==', -} +// [z-paging]公用的静态图片资源 + +export default { + base64Arrow: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAD1BMVEVHcExRUVFMTExRUVFRUVE9CdWsAAAABHRSTlMAjjrY9ZnUjwAAAQFJREFUWMPt2MsNgzAMgGEEE1B1gKJmAIRYoCH7z9RCXrabh33iYktcIv35EEg5ZBh07pvxJU6MFSPOSRnjnBUjUsaciRUjMsb4xIoRCWNiYsUInzE5sWKEyxiYWDbyefqHx1zIeiYTk7mQYziTYecxHvEJjwmIT3hMQELCYSISEg4TkZj0mYTEpM8kJCU9JiMp6TEZyUmbAUhO2gxAQNJiIAKSFgMRmNQZhMCkziAEJTUGIyipMRjBSZkhCE7KDEFIUmTeGCHJxWz0zXaE0GTCG8ZFtEaS347r/1fe11YyHYVfubxayfjoHmc0YYwmmmiiiSaaaKLJ7ckyz5ve+dw3Xw2emdwm9xSbAAAAAElFTkSuQmCC', + base64ArrowWhite: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAElBMVEVHcEz///////////////////+IGTx/AAAABnRSTlMA/dAkXZOhASU/AAABYElEQVRYw+2YwXLCIBCGsdAHWGbyAKZ4zxi9O017rxLf/1UaWFAgA1m8dcpedNSPf/l/Vh0Ya/Wn6hN0JcGvoCqRM4C8VBFiDwBqqNuJKV0rAnCgy3AUqZE57x0iqTL8Br4U3WBf/YWaIlTKfAcELU/h9w72CSVPa3C3OCDvhpHbRp/s2vq4fHhCeiCl2A3m4Qd71DQR257mFBlMcTlbFnFWzNtHxewYEfSiaLS4el8d8nyhmKJd1CF4eOS0keLMAuSxubLBIeIGQW8YHCFFo7EH9+YDcQt9FMZEswTheaNxTHwHT8SZorJjMrEVwo4Zo0U8HSEyZvJMOg4RjnmmRr8nDYeIz3OMkbfE/QhBo+U9RnZJxjGCRh/WKmHEMWLNkfPKsGh/CWJk1JjG0kcuJggTt34VDP8aWAFhp4nybVb5+9qQhjSkIQ1pSEMa8k+Q5U9rV3dF8MpFBK+/7miVq1/HZ2qmo9D+pAAAAABJRU5ErkJggg==', + base64Flower: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAKlBMVEVHcEzDw8Ovr6+pqamUlJTCwsKenp61tbWxsbGysrLNzc2bm5u5ubmjo6MpovhuAAAACnRSTlMA/P79/sHDhiZS0DxZowAABBBJREFUWMPtl89rE0EUx7ctTXatB3MI1SWnDbUKPUgXqh4ED8Uf7KUVSm3ooVSpSii0Fn/gD4j4o+APiEoVmos9FO2celiqZVgwgaKHPQiCCkv+F99kM7Ozm5kxq1dfD91k9pPve9/3ZjbRNHHok/mKli4eIPNgSuRObuN9SqSEzM20iGnm0yIbqCuV7NSSSIV7uyPM6JMBYdeTOanh/QihJYZsUCSby+VkMj2AvOt0rAeQAwqE3lfKMZVlQCZk1QOCKkkVPadITCfIRNKxfoJI5+0OIFtJx14CMSg1mRSDko7VAfksRQzEbGYqxOJcVTWMCH2I1/IACNW0PWU2M8cmAVHtnH5mM1VRWtwKZjOd5JbF6s1IbaYqaotjNlPHgDAnlAizubTR6ovMYn052g/U5qcmOpi0WL8xTS/3IfSet5m8MEr5ajjF5le6dq/OJpobrdY0t3i9QgefWrxW9/1BLhk0E9m8FeUMhhXal499iD0eQRfDF+ts/tttORRerfp+oV7f4xJj82iUYm1Yzod+ZQEAlS/8mMBwKebVmCVp1f0JLS6zKd17+iwRKTARVg2SHtz3iEbBH+Q+U28zW2Jiza8Tjb1YFoYZMsJyjDqp3M9XBQdSdPLFdxEpvOB37JrHcmR/y9+LgoTlCFGZEa2sc6d4PGlweEa2JSVPoVm+IfGG3ZL037iV9oH+P+Jxc4HGVflNq1M0pivao/EopO4b/ojVCP9GjmiXOeS0DOn1o/iiccT4ORnyvBGF3yUywkQajW4Ti0SGuiy/wVSg/L8w+X/8Q+hvUx8Xd90z4oV5a1i88MbFWHz0WZZ1UrTwBGPX3Rat9AFiXRMRjoMdIdJLEOt2h7jrYOzgOamKZSWSNspOS0X8SAqRYmxRL7sg4eLzYmNehcxh3uoyud/BH2Udux4ywxFTc1xC7Mgf4vMhc5S+kSH3Y7yj+qpwIWSoPTVCOOPVthGx9FbGqrwFw6wSFxJr+17zeKcztt3u+2roAEVgUjDd+AHGuxHy2rZHaa8JMkTHEeyi85ANPO9j9BVuBRD2FY5LDMo/Sz/2hReqGIs/KiFin+CsPsYO/yvM3jL2vE8EbX7/Bf8ejtr2GLN65bioAdgLd8Bis/mD5GmP2qeqyo2ZwQEOtAjRIDH7mBKpUcMoApbZJ5UIxkEwxyMZyMxW/uKFvHCFR3SSmerHyDNQ2dF4JG6zIMpBgLfjSF9x1D6smFcYnGApjmSLICO3ecCDWrQ48geba9DI3STy2i7ax6WIB62fSyIZIiO3GFQqSURp8wCo7GhJBGwuSovJBNjb7kT6FPVnIa9qJ2Ko+l9mefGIdinaMp0yC1URYiwsdfNE45EuA5Cx9EhalfvN5s+UyItm81vaB3p4joniN+SCP7Qc1hblAAAAAElFTkSuQmCC', + base64FlowerWhite: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAElBMVEX///9HcEz///////////////84chYNAAAABnRSTlP/AGzCOYZj5g1nAAACfklEQVRYw+2YTVPDIBCGtza9Jw25a0bvcax30o73OOr//yvma2F3YWlpPTijXNpAHrK8LLALVPFium2vNIFSbwGKTGQA2GUiHcD29yDNy3sMIdUBQl7r2H8mOEVqAHgPkYZUS6Qc2zYhQqtjyDZEximCZwWZLIBeIgYShs2NzxKpSUehYpMJhURGb+O+w5BpMCAREKPnCDHbIY20SzhM5yxziAXpOiBXydrekT9i5XDEq4NIIHHgyU5mRGqviII4mREJJA4QJzMiILwlRJzpKxJKvCBm8OsBBbLux0tsPl4RKYm5aPu6jw1U4mGxEUR9g8M1PcqBEp/WJliNgYOXueBzS4jZSIcgY5lCtevgDSgyzE+rAfuOTQMq0yzvoGH18qju27Mayzs4fPyMziCx81NJa5RNfW7vPYK9KOfDiVkBxFHG8hAj9txuoBuSWORsFfkpBf7xKFLSeaOefEojh5jz22DJEqMP8fUyaKdQx+RnG+yXMpe8Aars8ueR1pVH/bW3FyyvPRw90upLDHwpgBDtg4aUBNkxRLXMAi03IhcZtr1m+FeI/O/JNyDmmL1djLOauSlNflBpW18RQ2bPqXI22MXXEk75KRHTnkPkYbESbdKP2ZFk0r5sIwffAjy1lx+vx7NLjB6/E7Jfv5ERKhzpN0w8IDE8IGFDv5dhz10s7GFiXRZcUeLCEG5P5nDq9k4PFDcoMpE3GY4OuxuCXhmuyNB6k0RsLIAvqp9NE5r8ZCSS8gxnUp7ODdYhZTqxuiJ9uyJJtPmpqJ7wVj+XVieS903iViHziqAhchLEJAyb7jWU647EpUofQ0ziUuXXXhDddtlllSwjgSQu7r4BRWhQqfDPMVwAAAAASUVORK5CYII=', + base64Success: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAElBMVEVRUVFHcExTU1NRUVFRUVFRUVFOSlSUAAAABnRSTlP/AI6+VySB3ZENAAACcElEQVRYw+2YyYKCMAyGI8hdpdxdZu7gcpdZ7jL6/s8yYheSNi0aPdqbwOffpGmaFOYPD3gj4bisN7vddv17N/JVgxn5x12IWgIaWTuO/IE3PseQbwjGPo2cgRmHFLJwdm/X643zwiqOKPPJ1nj3sjEP2iiifZWj5bhopSyGaEO2HX5fbQJzwJ+W7x/jw5ZFjsEU0PMph9xE8i5EqprKALW95eJQURkgzw98uJ/JvwGecR7bIjWWsUgVrrIfFZ2HlLy3sKETD1mmRLRMRhGVssRa0xJkdn3SpJBymBkM8+pSSDXMDNyDaToVHd2fgpNt0sjwiUZO19+jGQ+gQEg9Oq+bufmAVGihomNmjQG7UG3020vrlm7lkFnKFGU3kZ0KGAdmKe821pipQ+qEKcrZeTL2g5FsUks4cStjEZWwXg0b0n4GxmEpkWwIs5VBynjgK7xZaz1/0D7OxkVuLpsY5BQNFyLS84VBjjbg0iL2r2EQHBOxBhikuUOkdxODVF1cxHoWtPPsiyXO455Iv34hssCO8EV4ZIYTjS8SR4qYSHRiTiYQ4ZFbHi0iIhhBTi6dTCgSWRcnw4h4yGTuyTAiOGBIWGoZTgSHJQl+LcOJ4OCnW6yX2bMnJ9pidCOXtkTkTrIGpYuOynAiOF14SamMiOCk5Ke+mq8BcOrrvym8d0zKIQnWT+M1WwOQNO4fFiWb18hhERxJPx2fblbPHHyC41VyiAtKBUFBIih7JMWVoIQTFIr3lKPN80WvoLSWFPC653ioTZA0I0FrQ7qU6asaK0H7JmkSJa2ooOGVtNUsc3j9FYHkIkJy3SG6VHnfXKXGP9t4N9Q4Ye98AAAAAElFTkSuQmCC', + base64SuccessWhite: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAGFBMVEVHcEz///////////////////////////8dS1W+AAAAB3RSTlMAiVYk6KvDHLfaegAAAo1JREFUWMPtWEtzmzAQNhCTq910ytXpiyvxTNOr60zrayepx9d02gnX4sTm7xcEiJX2gdnkGJ1A4tOnfWqXyeR1vMRYzrcPD9v5h5MBl3/Ldvx4cxIg/FWC8X0xjLjalM54uhhCfCrRuJURX0pi3EmIqZV7O59vrRZmguStHL9b7S7ftfLwOtiZDw7AHMtmquAQ12b5Wwbnordm8g9zLLO49qc/m2n6aKnhwPOGZ08hAiNHhheiHae1lOUPGZpQkPKa3q0mOUjaRzSRaGUjpy/mmWSwySSpllcEteBKAT52KEnSbblA51pJEPxBQoiH1FP4E3s5+FJv07h6/ylD6ui7B+9fq/ehrFB98ghec9EoVtyjK8pqCHLmCBOwMWSCeWFNN4MbPAk55NhsvoFHSSVR0k5TCTTEzlUGcqV/nVp7n9oIVkmtaqbAEqEgfdgHJPwsEAyZ9r4VAZXFjpEwyaw3+H2v42KYxKhs1XvY/gSSGv+IHyUSuHXCeZhLAgVI3EjgSGo1Fb3xO0tGGU9S2/KAIbtjxpJASG73qox6w5LUq0cEOa+iIONIWIilQSQ0pPa2jgaRQAgQP7c0mITRWGxpMAmEQFN2NAQJNCV0mI6GIIEO47hlQ0ORQLd0nL+hoUjg1m6I1TRr8uYEAriBHLcVFQ5UEMiBe3XkTBEG04WXlGKGxPnMS305XQPA1Ocn2JiuAZwE66fxnKwBnDTuXxZTMq85lwW6kt5ndLqZPefiU1yvmktcUSooChJF2aMprhQlnKJQ5FxRKkcVRa+itNYU8Io2oVkY14w0NMWYlqft91Bj9VHq+ca3b43BxjWJmla0sfKohlfTVpPN+93L/yLQ/IjQ/O5Q/VR5HdL4D7mlxmjwVdELAAAAAElFTkSuQmCC', + base64Empty: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAACWCAMAAAAL34HQAAALeGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDIgNzkuMTY0NDg4LCAyMDIwLzA3LzEwLTIyOjA2OjUzICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIyLTAyLTIyVDIxOjIxOjQ1KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDI0LTAxLTEzVDE5OjA5OjQwKzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNC0wMS0xM1QxOTowOTo0MCswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ZWQwMWYzNWQtOWRjOC00MDBiLWEyMmQtNjM5OGZiNzVhNGRiIiB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZDhlMzQ3ZmEtMDY2My1jYTRiLTgzNTctNTk4YjBkNGIzOTU2IiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6ZDA4MDI4MDItMzUyYS04NTRhLTkxYjctNmRlNmQ1MmViM2QwIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiIHRpZmY6T3JpZW50YXRpb249IjEiIHRpZmY6WFJlc29sdXRpb249IjMwMDAwMDAvMTAwMDAiIHRpZmY6WVJlc29sdXRpb249IjMwMDAwMDAvMTAwMDAiIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiIGV4aWY6Q29sb3JTcGFjZT0iMSIgZXhpZjpQaXhlbFhEaW1lbnNpb249IjMwMCIgZXhpZjpQaXhlbFlEaW1lbnNpb249IjMwMCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZDA4MDI4MDItMzUyYS04NTRhLTkxYjctNmRlNmQ1MmViM2QwIiBzdEV2dDp3aGVuPSIyMDIyLTAyLTIyVDIxOjIxOjQ1KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQwNjg2NzJkLWY5NDMtOTU0Mi1iMDBiLTVlMDExNmE1NmIzZSIgc3RFdnQ6d2hlbj0iMjAyNC0wMS0xM1QxMDoyNjoxNiswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDphYmJkZmUyZC0xY2Q2LTJiNDgtYjUyNS05YzlhZjdlNjA4NDMiIHN0RXZ0OndoZW49IjIwMjQtMDEtMTNUMTE6MjM6NDArMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvcG5nIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6YTQ5MjM5MDAtNDhiZC03YTQ1LWI4NGItYmVlZTVjOWUxYTM1IiBzdEV2dDp3aGVuPSIyMDI0LTAxLTEzVDExOjIzOjQwKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmVkMDFmMzVkLTlkYzgtNDAwYi1hMjJkLTYzOThmYjc1YTRkYiIgc3RFdnQ6d2hlbj0iMjAyNC0wMS0xM1QxOTowOTo0MCswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjAgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOmFiYmRmZTJkLTFjZDYtMmI0OC1iNTI1LTljOWFmN2U2MDg0MyIgc3RSZWY6ZG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjM2ZGQ4NTQxLWQ0MWEtYmY0Yy1iZjA3LWNmNjZhNjZhMDg2MSIgc3RSZWY6b3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmQwODAyODAyLTM1MmEtODU0YS05MWI3LTZkZTZkNTJlYjNkMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pm30U/gAAAAJcEhZcwAALiMAAC4jAXilP3YAAAA/UExURUdwTODg4O3t7e7u7unp6d7e3uTk5M/Pz8nJyePj4+jo6Pj4+MrKyszMzO7u7unp6fb29vLy8vr6+v7+/sHBweag3xAAAAAOdFJOUwAxia5pF0n+/vzX3KbULQ2DYQAACG1JREFUeNrtm4l2o7gShi20IWFrAd7/WUc7EosDWKZ976Hc7WTmdMKXv0qlqpLyeNx222233Xbbbbfddtv/mOHn8xexSNsiRH5PrbFtW4p+DetpsF4v8Gs+HA3WEwOAfwzriYxaLTVsP8X1QK0z+vqQCzewYogi60aL9SEX5oyxphYVCFTGjfSJCTmN1jBruN5KTGCUS8bhySQGHRaohmW4glwtldbOeYJYKlgvbyUuA8aFFEKc++aIM4hrRnyiMnIZKq1PrihcM3GNKboMF1Naa9X9+8T1KrxIlVbGjv3cAEHOYYMqqgUsVuJqqehV3+sjDwB+DTJp0lYtMCyZpxqjF4e+74+sRcQSFZO8UonUSEFzuUY+DKo59A2kZDatGCjzCauy/2AmhSyCq0WHEj0KTNJDmVeNhErMt1Q8W4xti4/FwMJ4jaxl05TKFiNtD3kBGrHnhiph9V0eXQc6DkyE2xX830AlKshFTErXeuCZXK/9m41wFsGSfZ4lcGeyZ98PrylJ7MWCojQZ3qSukL2QslgdngqJnTEPdTJhXvbNBoR/+7wabIxWduN/Ja5dWEivm4XSZ2uQckNzmRlHrn2lc6eiafvS4V2Hd12tesau8toZW0CtWoZYb9t+OqxdCYKYjVPF16pVbILIy/gR7MVaWMHYPCoa2VkzkX4Iry2rirXbumGyAjGC1h62YLw6ApsNKZph3fpIWHt08JovRWD62sejpXhTrhWrPpl6zZ6PW2oTG5ltlvgtF6weNYCWKeJJSfg4W6PNJlj3sVZgOXV4lc8n4RlkMTLEBDVoYc3nI09kpyzzfgWsjyzBZSNDKF2/wjh+sxYvn8Y1scxlfLF9T1RBO3wVHsnq8Fk4oGkEh/0KJPSa8T2CeWE5X9BPmgLsaRIGeNL2kshCsWoLBmdPJW5Wbz1ndAKUXjPwxXYAUpSV3fy5BJg1aa1tyVXHHMgVH31ewDVrleHr9XqC684SUF4mecR3+wW5SC2QNvxUizRv98mLDhPgYiMDb+v8g0OADxqxcnf9w01mZYJF0fUVP5LcdswbsMmy1DVs5PlE5NpNiTR8M8qAWZkOy6aN13VcoOF2/s3xn3Mes8Xza05tgR/BuNz69nlNzMR0fH45p+G4R9oxh2mKt9MF4J7K/lvWUojwF5nCgCpuRUptnZMQ3au0nSo2UsHgV3xpmeLYzGml3ZFBBzYGPCpOQRwXs1/GG1J74dlZc6JKUOtjBAz9XjVxucGWHbZVJDPJQGYDRl1Qmf1ovk2Sbghb6MQlnF7mBzM1bgOqJAPpoOQaVe+4Skcit3uqHMyG/Sh1rHNN0gAfM0nnPrmulfLVBSm20TSZSdWa0LJl2ukVyE4vTYCgP3uQkwv1TKtQWgxDzBSg80OQjCs4klKvuUzHLCfIbDKIE/S5VIGqD1iD2819pkAqTWdmeina+oZABi7X5B1MGoTJqJSchuk6JNHcgUPAcsVFk0+N0oDN68Vo7FQSmCXjx46OEtUk1lpY2ZFQGr/AcpqVato4wPUD+RhfAeyQI5sJ6l2sDwnKqNFSJvpiyJbFl3kTOjZ2ievwCR7hkUoWeV2vOLAXvB39AJoyqYa81A5cvaAidXYTFTycKDBcalVK5f3XS89kzLVl9txfL+K+p6NUnitz5KkKm7D3DrRPNq4bk7l20aFRppNilmuQI+uzTtj9wPBkTsVwM7HbJ5pwGgujyRyZDzQLNoiRFluRtQ+GzEguqRxUL+ZMFqulMzIfaP3ARj2k/txB8c+2HyjmDizCaVWtNoE5MvMlKs/4VQ7HUJZCrU6qCKcNJ2aSWUZhJZu4VI0LB4CHFdj77DRuGi28WKAxoRyZyzGVrmc0jmk1nP5QaxZo1puqq1YIAqgZb8e/rABZJWNCNxV7DSTpOO7Aail9J9nYHtua/4ouE/aS0X1qtXQzwGx+rnbi2vhF/TfZG52oc6DPo1WCi3RTDnRk7TEntoEp38gg+DjYs2opkR3JW5EpL9rU0XSK5/6LOTAVS+72x7pm60zSf5HMdldjhzJqw1FRcxXdS3ZNZp0s92FiyluUvBPoD9ynZNkBiu2NF11ofnlnQbZgKqvusj9R/f6DOzgVsahbNlXxlsxU8y7qrbTupitRyxFBKG6H3aEPUqj7YrzAymq41FXlZLlO4WLbvG2Kg4vYB+wPfWS2B5Rq8TW9ROpAZbiF6MmCTsx1NLLsx7NOoOiZup2CNbZ36xc96ErcxzuILGrmmFhimjtwKo/yTm7feTVwB61IzbnW4967Kt3cDDotGt8JKrTiUyO3Uy2PZZt9tapXEfXhWmTgcoB+JchFWsiCKvYnhmn/tKuJDbgly897FnFfkE1rQLKy810OU7xW3bEJHCD5gERtuTGuxoJqA6qI9TNMa6MbvZomsiubbPYx78YXDaaRqqsyqfSaLZdjYGHLu65rDgydXCWm1P5EvcQ828f9pcBapTILSMv1nZCAc0WzFIFsGfUi/kmAxc6cFqDSYuPSMIbs1OVrwITTQM9HVRFJ5JL56qcoFzzT1uVcd2v9jFw8BHlcWtmEI86hp5Dy/zOlK8cUp/rVseRUBqawz6kmAcPLM9l5m8h4V53Iz/2mFJaTCvF8JbsMvPjU/7crbUXart0v4WyE0LnDPcAX95Knj4VUE8HCdNdUP8BDcOXKdPl4uSWbh4LfOV0HDdfipOmu+eIRrDsNPkIT7np/8ZAzVdOd1u8wHIqeXt8VqtgiO50ePeNaGG+uO9rHiKdL71pnIun8jxEKXv2r2HYBzO/mz96vFKoMM5WLk7tQXS9U5kwCu5lk7n6++kdCFWRaTUzm0/5fClWGWTrM/AGhCrJO/ZBQhTPFLwmV7ebgcdttt91222233Xbbbf+H9h+2WEtdHVinLAAAAABJRU5ErkJggg==', + base64Error: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAACWCAMAAAAL34HQAAALeGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDIgNzkuMTY0NDg4LCAyMDIwLzA3LzEwLTIyOjA2OjUzICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIyLTAyLTIyVDIxOjIxOjQ1KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDI0LTAxLTEzVDE5OjEwOjEwKzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNC0wMS0xM1QxOToxMDoxMCswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTQ3NTExNjAtZDY5MC00ZTkzLWFhNGUtNGMwYTViNGU1ZGFjIiB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6YzRiNzlkYWMtZTJmYS1iNzQ0LWIxM2ItOWU1N2VjMDhhM2YwIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6ZDA4MDI4MDItMzUyYS04NTRhLTkxYjctNmRlNmQ1MmViM2QwIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiIHRpZmY6T3JpZW50YXRpb249IjEiIHRpZmY6WFJlc29sdXRpb249IjMwMDAwMDAvMTAwMDAiIHRpZmY6WVJlc29sdXRpb249IjMwMDAwMDAvMTAwMDAiIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiIGV4aWY6Q29sb3JTcGFjZT0iMSIgZXhpZjpQaXhlbFhEaW1lbnNpb249IjMwMCIgZXhpZjpQaXhlbFlEaW1lbnNpb249IjMwMCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZDA4MDI4MDItMzUyYS04NTRhLTkxYjctNmRlNmQ1MmViM2QwIiBzdEV2dDp3aGVuPSIyMDIyLTAyLTIyVDIxOjIxOjQ1KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQwNjg2NzJkLWY5NDMtOTU0Mi1iMDBiLTVlMDExNmE1NmIzZSIgc3RFdnQ6d2hlbj0iMjAyNC0wMS0xM1QxMDoyNjoxNiswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpjZjk1NTE1OC04MjFiLTA4NDUtYWJmNS05YTE1NGM1ZTY4NjEiIHN0RXZ0OndoZW49IjIwMjQtMDEtMTNUMTE6MDQ6MDQrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvcG5nIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZGM1Y2IyNWItZDZlNC0yZjQ2LTgyODQtZmUwOTNlY2M2ZTkxIiBzdEV2dDp3aGVuPSIyMDI0LTAxLTEzVDExOjA0OjA0KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjE0NzUxMTYwLWQ2OTAtNGU5My1hYTRlLTRjMGE1YjRlNWRhYyIgc3RFdnQ6d2hlbj0iMjAyNC0wMS0xM1QxOToxMDoxMCswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjAgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOmNmOTU1MTU4LTgyMWItMDg0NS1hYmY1LTlhMTU0YzVlNjg2MSIgc3RSZWY6ZG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjM2ZGQ4NTQxLWQ0MWEtYmY0Yy1iZjA3LWNmNjZhNjZhMDg2MSIgc3RSZWY6b3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmQwODAyODAyLTM1MmEtODU0YS05MWI3LTZkZTZkNTJlYjNkMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Ph2LDQsAAAAJcEhZcwAACxMAAAsTAQCanBgAAAA5UExURUdwTNra2s7Ozq2tre3t7dPT087OzuPj4+3t7dbW1u/v79bW1vz8/MrKytDQ0Nzc3MPDw/X19bi4uMZQDnEAAAAKdFJOUwBqEPywotz+wzqApqiTAAAHW0lEQVR42u1b25akIAwcbx2UFoj//7HLTQVBRcSZfTDnbM/uTl/KSlEkwf75eeONN95444033njjjTduR9/0/yOsbqoevObL7101tYX1HFs9QFtfZalRP+rpQVgdAFx990ZnT8L6eZItUl99jeGpf1DxdV/VP9fV1f/PFlF1bYHoVFSRC60IyVjrFRnuB8IoxpExSrstsErKHpJw1eqybNLbAQvAYkKjUrjoBgKRqAaeIjG5+qaps6hKcMWmcdSwqAJWBbAgCZZaIYbsqggqqlHNbFFa5yVR4jKvrKEErOEjNCqNSwHrfE8lpLsod/u+cOPPMPBJ+Gz5dM0cXNgclre+pSxhYI1WW5Tf9ENSMIdLCiWs6q9hwQprBVYKFqyPlx4WtoSvrT9lC/wkGt8qlkQooC3hi6sgW3Bb8gtdpSV/za/mn49pC0oYhONbfyd5hzDLFivKFpTS1gKM0we0tQCEncfgQn7Rt+DC/299i1MSRJcBC0r7VviG5KZvwV5WIUobxHyrJKy8VRjXVgFYsPu5kOtbxdhycCDuihziXVLoW7xwEiUmDgd544B46luWLW+nugMLB2BimmC3cxTNxCDg8xFtuUSNqoFsDKzY8psa+XtBNWXr74N6qxwsS5T6VL5robKl10+ZRu5S9qBvUYuJwVHzjwjrE3G33qKh+WXBgmkmCvHYquTvZ8oo7rLFA4PJgYW0MdePIRQIGUPNbSMw5lubJMKtJI6+Wk6cVFMmACO+VVryeL7ZgI8MhwS2fnNPPK0geHBRd11eJSiyL4KjrL2umm1XIpRii1MKB/mU/iCZwF+pt5z3UJ7UiF3nQqadAXC3T3xEW2IyuDBe3yDTe0+A64it2WTyYSGVHymUI/EduvSWKJ80Dtv2NbYSoQxbMkVC7yzNGIWFvDF7gRD79RYrWW/BDGti4wwLtgvO7gWKUZ8Mt94qX8vLJE70+xVNwzDm9ghNM+FX7p/jlZUId2HJD+Tf79hMe3WNrAK/30E+C8/6xOCqbqxE5JNMYrNbnaLUvJAewfCg8zF0Ba/tbviWLvPYfsGFA1PVD8ZdnjlVc/DS/o7LK4NHjOjKKbfCTSCo5XmwKbaZM4jlc9NGEYd9Ijd0QS5ZGaOR2O+DPlGyRb2nXZzgnI1GdFWF+0gh3ifyTRqvzpXI2eElk58FeHziCF5hY+hSMV9Ge/mohUTGuQ4vzHYe8bW5sNdFQ58St22Vcf5zzJbtcGT4iYQ7iz8dFuxoWRYMjAM7KCnypHOTLSqdUwYIFpndOD/6B2FBzNQxYmW/zxYE4j8yLHga1s2Rbm/O5PXtGcuNDIW1dTj5hpjGsO+7z2Kk9NP1JWDlnWKAM4H6zCUNM05KyVPHBclYzUbgjE3N3tP2JWHBmbqD4GLeCs2jhMT13lMVljwcEbetwZgtHUxVQ21ho3fE7inf2s8vzMWq0EWpfOBg5hcDSGwaF2+LaysRIzNFqRgBv2sMhi/Ix0WiW8rBKNBv4ExBI7eorx9ANazsPCb5FkSNH+Reacos+AYxaFzX76KMH65c8ytzZ40YvpFAqtgC/otn1eCmMI5K8yVRQVVwq3aVtU+jJktwjyP7x+BKv8vtoH098vXYSJcrWGJcAW11r8WVRxe5vgcuFbXqwnaEZejS6mrLwYKUg1ch2RJswTFYgMOwoau+AQsSp/FuDhVZi7J402ifgGla/GJIzGLYG5H4rnKMCUydL9wcsmZSuPikR2QmjQbWqaV2ob2RdMvaLEvFlRiXpYeTwqVOtMZF+qi0dS4uEjJKMvWuYK3S0jHZwaq7BylYp/O2uu3q04lNqudLWEJQd/3paTBz12IaLIPtzE5P1AUuW9TB8NVzaG9/TIfV+eXsWeezz6HWlptEbo4SIAeWur/Y/RZC/gmZTiLzUY2j5ct6fjKsFvxqgyQxE9sbmfYtnJMIciEKo6+FL0wziJmtkzspIcUl0PgWrL7VCKP7hl61U4WLeN+7Ieli2vZhmq0VgjDOgIyhJ62sSpDkWNZa1wiB8WoLlxzy29XpGVPgn1ut5VYcGyRLK7OCiJaDYMrAneJUkZWdw0yDgNm5nDowqLc0Kp581FO7QS4pC9S/YRW9xkVdNOj0ZHCp9anEZw3VEK/fopiDrkMObkcdJtT1g6+uzQ60bIdUPztdWZWy53m+v/zFYPOGHO4AZsalmtJNkyHrCAx1RXX7mt5g1L1pDezpkXv8wJwpVRSSaf2c26Y0rrXXxyWBptu/ovdak+VhkqjGBZUdvKygqANKA/MqZ/36kcGwFn90RnWp66ksKuHgitLFY8BU+F2ZvqpxpMY9qR3YwOUJ12fc0KUHVKdswcKXuwetErCnwvMKuXxfc/3RVJ2yFc+iosQd3X+WGSVz1UiuN2J156FyVyHbsOUp3krezaPUT/VxXqdfwvknb/Zgp+idTxTbrkLqYuKreRnhy65Gf4W0NsDoYiqf6uZsvr8V9eo6XWc5+3TVf/3N1TfeeOONN95444033njjjTfeSI1/IeOYOeO4fGAAAAAASUVORK5CYII=', + base64BackToTop: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADIBAMAAABfdrOtAAAAElBMVEVRUVH+/v5HcEyZmZlRUVFRUVGm1ByOAAAABnRSTlPMzADMTZAJBBGsAAAEnElEQVR42t2cS27jMAyGf7/2U+QCQeDsbeQCgZDujaC5/1UmkzaJn+JDFGcw3LdfflKibJkkDnxrL7dbg7sNt6+L4O8OYBM+B0ys+QrGkHZG+OEEQ8g6go8Bx1GIGMdpNOQyIG6XdMgnSPtKhLQDGEZFBgYMkhKFtGBb0EIEjDgFRowoBVaMGAWpMedEfxMiZtwpUsgZCqtlkCNUdpVAWigtCCCDFtLwIWeoreZCWiRYYEKGFEjDg+yRZCUH0iLRAgNyToXUNCRZyMqWhGnUN2IPm3wSlwJ7IUspyCBkIQUZhCykIIeQuRTkEDKXAuM9srrtYbrZN7Y98giZSoFd+t1OxmMITG0dcrSFXFchZ1tIvQZpYWxhBbK3hpQrkMEa0iwh5t4a+QvZvDXyF7J5a+Qv5PPW21/I5623v5DPW29/IaO3Xv5Clrw1y1/Ikrdm+Qs5svw83yNnSJ5BQb4F/F7EIEJSnThGBAXxkFQfLOviQUE8JAUPsosHBfGQfDAtHhREQ1JxIV00KIgmrnRI84S0yAd5BAXxxJUck0f6Qnwr9qmr6xF5xLMjcwn/iudIEAdWnyjkEXlQKZiRVzoqRyLbgeUKKR8Q4alY7cSnoxzSf2ggsqehKr6YVpcXpOd7H93f60cKhOd7Re2LteUF4eLqiVS1mr0ge4io6C2+soaFkJ7MuuuQs1yITEp9hwwKISIpzR2iESKSIoT0rLNwuVHQqoSIpAQJpGce60vIUSdEIuUqgPTsJ5QFZK8UIpBS8iG94GFrDjlrhfCl8CG96Llxmle4kEr6vKWBPIVo9kqDQSRk9/3cWoikcCFPAd33v4dIChPyEvLzBA6RlEYWke4JEUnhKXkLeUEKxRHJFfKCQHGucIW8IdZSRkLeEGMpYyEjiK2UsZARxFTKRMgYYillImQMMZQyFTKB2EmZCplAuFLIHT8TMoWwpQwiIVMIUwqpZP5bp5CCvCTiQKr5f5lCQN+tPCBn2ZvVDFJwIDUP0m1BYAfZYRNSsCB7BqTbhoARePIxtZ9tgwWkoJcwCalmv3MBAemtO4R6dah2HaKQqj8Zvp9sQDjvJ21+SPCBHPJDDk6QITekEV7gqCC19CpKAym9IMfckKv4olMBCeIrWwVEfvkshzQekO9r9P1/ALk+IG1eSPCDiCJfyG+FyU+A6ZCa/piZDinpz7LpkCv5gdkAEshP5emQhv7onw6pGeULyZCSUYiRDAmMkpJkCKs4JhFSq8p8hJBSVbAkhARV6ZUQoisik0FqXTmcDHLVFfbJIEFXoiiCNMpiSxGkVJaNiiBBWQArgTTaUl4JpNQWJUsgQVteXQg+AKkLxQWFGKW+5J2+eVp4S168X3CF1CltCKdTJ8lb84YK2bUBO+wZW0Pqv9nk4tKu49N45NJC5dMM5tLW5tOg59Jq6NM06dL+abFXwr/RkuvTXJwae1abtE/Dt0/ruksTvs84AZ/BCC4jHnyGVfiM3VBQFANEXEah+Ax18RlP4zNox2dkkM/wI58xTn8yDCXGYCDV3W5RGSajtXyGhG1jbpbjzpwGt/0MJft8jqC7iUbQ/QZaxdnKqcIftwAAAABJRU5ErkJggg==', +} diff --git a/uni_modules/z-paging/components/z-paging/js/z-paging-utils.js b/uni_modules/z-paging/components/z-paging/js/z-paging-utils.js index b06c6fe3..bd595e54 100644 --- a/uni_modules/z-paging/components/z-paging/js/z-paging-utils.js +++ b/uni_modules/z-paging/components/z-paging/js/z-paging-utils.js @@ -1,270 +1,270 @@ -// [z-paging]工具类 - -import zLocalConfig from '../config/index' -import c from './z-paging-constant' - -const storageKey = 'Z-PAGING-REFRESHER-TIME-STORAGE-KEY'; -let config = null; -let configLoaded = false; -const timeoutMap = {}; - -// 获取默认配置信息 -function gc(key, defaultValue) { - // 这里return一个函数以解决在vue3+appvue中,props默认配置读取在main.js之前执行导致uni.$zp全局配置无效的问题。相当于props的default中传入一个带有返回值的函数 - return () => { - // 处理z-paging全局配置 - _handleDefaultConfig(); - // 如果全局配置不存在,则返回默认值 - if (!config) return defaultValue; - const value = config[key]; - // 如果全局配置存在但对应的配置项不存在,则返回默认值;反之返回配置项 - return value === undefined ? defaultValue : value; - }; -} - -// 获取最终的touch位置 -function getTouch(e) { - let touch = null; - if (e.touches && e.touches.length) { - touch = e.touches[0]; - } else if (e.changedTouches && e.changedTouches.length) { - touch = e.changedTouches[0]; - } else if (e.datail && e.datail != {}) { - touch = e.datail; - } else { - return { touchX: 0, touchY: 0 } - } - return { - touchX: touch.clientX, - touchY: touch.clientY - }; -} - -// 判断当前手势是否在z-paging内触发 -function getTouchFromZPaging(target) { - if (target && target.tagName && target.tagName !== 'BODY' && target.tagName !== 'UNI-PAGE-BODY') { - const classList = target.classList; - if (classList && classList.contains('z-paging-content')) { - // 此处额外记录当前z-paging是否是页面滚动、是否滚动到了顶部、是否是聊天记录模式以传给renderjs。避免不同z-paging组件renderjs内部判断数据互相影响导致的各种问题 - return { - isFromZp: true, - isPageScroll: classList.contains('z-paging-content-page'), - isReachedTop: classList.contains('z-paging-reached-top'), - isUseChatRecordMode: classList.contains('z-paging-use-chat-record-mode') - }; - } else { - return getTouchFromZPaging(target.parentNode); - } - } else { - return { isFromZp: false }; - } -} - -// 递归获取z-paging所在的parent,如果查找不到则返回null -function getParent(parent) { - if (!parent) return null; - if (parent.$refs.paging) return parent; - return getParent(parent.$parent); -} - -// 打印错误信息 -function consoleErr(err) { - console.error(`[z-paging]${err}`); -} - -// 延时操作,如果key存在,调用时清除对应key之前的延时操作 -function delay(callback, ms = c.delayTime, key) { - const timeout = setTimeout(callback, ms);; - if (!!key) { - timeoutMap[key] && clearTimeout(timeoutMap[key]); - timeoutMap[key] = timeout; - } - return timeout; -} - -// 设置下拉刷新时间 -function setRefesrherTime(time, key) { - const datas = getRefesrherTime() || {}; - datas[key] = time; - uni.setStorageSync(storageKey, datas); -} - -// 获取下拉刷新时间 -function getRefesrherTime() { - return uni.getStorageSync(storageKey); -} - -// 通过下拉刷新标识key获取下拉刷新时间 -function getRefesrherTimeByKey(key) { - const datas = getRefesrherTime(); - return datas && datas[key] ? datas[key] : null; -} - -// 通过下拉刷新标识key获取下拉刷新时间(格式化之后) -function getRefesrherFormatTimeByKey(key, textMap) { - const time = getRefesrherTimeByKey(key); - const timeText = time ? _timeFormat(time, textMap) : textMap.none; - return `${textMap.title}${timeText}`; -} - -// 将文本的px或者rpx转为px的值 -function convertToPx(text) { - const dataType = Object.prototype.toString.call(text); - if (dataType === '[object Number]') return text; - let isRpx = false; - if (text.indexOf('rpx') !== -1 || text.indexOf('upx') !== -1) { - text = text.replace('rpx', '').replace('upx', ''); - isRpx = true; - } else if (text.indexOf('px') !== -1) { - text = text.replace('px', ''); - } - if (!isNaN(text)) { - if (isRpx) return Number(uni.upx2px(text)); - return Number(text); - } - return 0; -} - -// 获取当前时间 -function getTime() { - return (new Date()).getTime(); -} - -// 获取z-paging实例id,随机生成10位数字+字母 -function getInstanceId() { - const s = []; - const hexDigits = "0123456789abcdef"; - for (let i = 0; i < 10; i++) { - s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); - } - return s.join('') + getTime(); -} - -// 等待一段时间 -function wait(ms) { - return new Promise(resolve => { - setTimeout(resolve, ms); - }); -} - -// 是否是promise -function isPromise(func) { - return Object.prototype.toString.call(func) === '[object Promise]'; -} - -// 添加单位 -function addUnit(value, unit) { - if (Object.prototype.toString.call(value) === '[object String]') { - let tempValue = value; - tempValue = tempValue.replace('rpx', '').replace('upx', '').replace('px', ''); - if (value.indexOf('rpx') === -1 && value.indexOf('upx') === -1 && value.indexOf('px') !== -1) { - tempValue = parseFloat(tempValue) * 2; - } - value = tempValue; - } - return unit === 'rpx' ? value + 'rpx' : (value / 2) + 'px'; -} - -// 深拷贝 -function deepCopy(obj) { - if (typeof obj !== 'object' || obj === null) return obj; - let newObj = Array.isArray(obj) ? [] : {}; - for (let key in obj) { - if (obj.hasOwnProperty(key)) { - newObj[key] = deepCopy(obj[key]); - } - } - return newObj; -} - -// ------------------ 私有方法 ------------------------ -// 处理全局配置 -function _handleDefaultConfig() { - // 确保只加载一次全局配置 - if (configLoaded) return; - // 优先从config.js中读取 - if (zLocalConfig && Object.keys(zLocalConfig).length) { - config = zLocalConfig; - } - // 如果在config.js中读取不到,则尝试到uni.$zp读取 - if (!config && uni.$zp) { - config = uni.$zp.config; - } - // 将config中的短横线写法全部转为驼峰写法,使得读取配置时可以直接通过key去匹配,而非读取每个配置时候再去转,减少不必要的性能开支 - config = config ? Object.keys(config).reduce((result, key) => { - result[_toCamelCase(key)] = config[key]; - return result; - }, {}) : null; - configLoaded = true; -} - -// 时间格式化 -function _timeFormat(time, textMap) { - const date = new Date(time); - const currentDate = new Date(); - // 设置time对应的天,去除时分秒,使得可以直接比较日期 - const dateDay = new Date(time).setHours(0, 0, 0, 0); - // 设置当前的天,去除时分秒,使得可以直接比较日期 - const currentDateDay = new Date().setHours(0, 0, 0, 0); - const disTime = dateDay - currentDateDay; - let dayStr = ''; - const timeStr = _dateTimeFormat(date); - if (disTime === 0) { - dayStr = textMap.today; - } else if (disTime === -86400000) { - dayStr = textMap.yesterday; - } else { - dayStr = _dateDayFormat(date, date.getFullYear() !== currentDate.getFullYear()); - } - return `${dayStr} ${timeStr}`; -} - -// date格式化为年月日 -function _dateDayFormat(date, showYear = true) { - const year = date.getFullYear(); - const month = date.getMonth() + 1; - const day = date.getDate(); - return showYear ? `${year}-${_fullZeroToTwo(month)}-${_fullZeroToTwo(day)}` : `${_fullZeroToTwo(month)}-${_fullZeroToTwo(day)}`; -} - -// data格式化为时分 -function _dateTimeFormat(date) { - const hour = date.getHours(); - const minute = date.getMinutes(); - return `${_fullZeroToTwo(hour)}:${_fullZeroToTwo(minute)}`; -} - -// 不满2位在前面填充0 -function _fullZeroToTwo(str) { - str = str.toString(); - return str.length === 1 ? '0' + str : str; -} - -// 驼峰转短横线 -function _toKebab(value) { - return value.replace(/([A-Z])/g, "-$1").toLowerCase(); -} - -// 短横线转驼峰 -function _toCamelCase(value) { - return value.replace(/-([a-z])/g, (_, group1) => group1.toUpperCase()); -} - - -export default { - gc, - setRefesrherTime, - getRefesrherFormatTimeByKey, - getTouch, - getTouchFromZPaging, - getParent, - convertToPx, - getTime, - getInstanceId, - consoleErr, - delay, - wait, - isPromise, - addUnit, - deepCopy -}; +// [z-paging]工具类 + +import zLocalConfig from '../config/index' +import c from './z-paging-constant' + +const storageKey = 'Z-PAGING-REFRESHER-TIME-STORAGE-KEY'; +let config = null; +let configLoaded = false; +const timeoutMap = {}; + +// 获取默认配置信息 +function gc(key, defaultValue) { + // 这里return一个函数以解决在vue3+appvue中,props默认配置读取在main.js之前执行导致uni.$zp全局配置无效的问题。相当于props的default中传入一个带有返回值的函数 + return () => { + // 处理z-paging全局配置 + _handleDefaultConfig(); + // 如果全局配置不存在,则返回默认值 + if (!config) return defaultValue; + const value = config[key]; + // 如果全局配置存在但对应的配置项不存在,则返回默认值;反之返回配置项 + return value === undefined ? defaultValue : value; + }; +} + +// 获取最终的touch位置 +function getTouch(e) { + let touch = null; + if (e.touches && e.touches.length) { + touch = e.touches[0]; + } else if (e.changedTouches && e.changedTouches.length) { + touch = e.changedTouches[0]; + } else if (e.datail && e.datail != {}) { + touch = e.datail; + } else { + return { touchX: 0, touchY: 0 } + } + return { + touchX: touch.clientX, + touchY: touch.clientY + }; +} + +// 判断当前手势是否在z-paging内触发 +function getTouchFromZPaging(target) { + if (target && target.tagName && target.tagName !== 'BODY' && target.tagName !== 'UNI-PAGE-BODY') { + const classList = target.classList; + if (classList && classList.contains('z-paging-content')) { + // 此处额外记录当前z-paging是否是页面滚动、是否滚动到了顶部、是否是聊天记录模式以传给renderjs。避免不同z-paging组件renderjs内部判断数据互相影响导致的各种问题 + return { + isFromZp: true, + isPageScroll: classList.contains('z-paging-content-page'), + isReachedTop: classList.contains('z-paging-reached-top'), + isUseChatRecordMode: classList.contains('z-paging-use-chat-record-mode') + }; + } else { + return getTouchFromZPaging(target.parentNode); + } + } else { + return { isFromZp: false }; + } +} + +// 递归获取z-paging所在的parent,如果查找不到则返回null +function getParent(parent) { + if (!parent) return null; + if (parent.$refs.paging) return parent; + return getParent(parent.$parent); +} + +// 打印错误信息 +function consoleErr(err) { + console.error(`[z-paging]${err}`); +} + +// 延时操作,如果key存在,调用时清除对应key之前的延时操作 +function delay(callback, ms = c.delayTime, key) { + const timeout = setTimeout(callback, ms);; + if (!!key) { + timeoutMap[key] && clearTimeout(timeoutMap[key]); + timeoutMap[key] = timeout; + } + return timeout; +} + +// 设置下拉刷新时间 +function setRefesrherTime(time, key) { + const datas = getRefesrherTime() || {}; + datas[key] = time; + uni.setStorageSync(storageKey, datas); +} + +// 获取下拉刷新时间 +function getRefesrherTime() { + return uni.getStorageSync(storageKey); +} + +// 通过下拉刷新标识key获取下拉刷新时间 +function getRefesrherTimeByKey(key) { + const datas = getRefesrherTime(); + return datas && datas[key] ? datas[key] : null; +} + +// 通过下拉刷新标识key获取下拉刷新时间(格式化之后) +function getRefesrherFormatTimeByKey(key, textMap) { + const time = getRefesrherTimeByKey(key); + const timeText = time ? _timeFormat(time, textMap) : textMap.none; + return `${textMap.title}${timeText}`; +} + +// 将文本的px或者rpx转为px的值 +function convertToPx(text) { + const dataType = Object.prototype.toString.call(text); + if (dataType === '[object Number]') return text; + let isRpx = false; + if (text.indexOf('rpx') !== -1 || text.indexOf('upx') !== -1) { + text = text.replace('rpx', '').replace('upx', ''); + isRpx = true; + } else if (text.indexOf('px') !== -1) { + text = text.replace('px', ''); + } + if (!isNaN(text)) { + if (isRpx) return Number(uni.upx2px(text)); + return Number(text); + } + return 0; +} + +// 获取当前时间 +function getTime() { + return (new Date()).getTime(); +} + +// 获取z-paging实例id,随机生成10位数字+字母 +function getInstanceId() { + const s = []; + const hexDigits = "0123456789abcdef"; + for (let i = 0; i < 10; i++) { + s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); + } + return s.join('') + getTime(); +} + +// 等待一段时间 +function wait(ms) { + return new Promise(resolve => { + setTimeout(resolve, ms); + }); +} + +// 是否是promise +function isPromise(func) { + return Object.prototype.toString.call(func) === '[object Promise]'; +} + +// 添加单位 +function addUnit(value, unit) { + if (Object.prototype.toString.call(value) === '[object String]') { + let tempValue = value; + tempValue = tempValue.replace('rpx', '').replace('upx', '').replace('px', ''); + if (value.indexOf('rpx') === -1 && value.indexOf('upx') === -1 && value.indexOf('px') !== -1) { + tempValue = parseFloat(tempValue) * 2; + } + value = tempValue; + } + return unit === 'rpx' ? value + 'rpx' : (value / 2) + 'px'; +} + +// 深拷贝 +function deepCopy(obj) { + if (typeof obj !== 'object' || obj === null) return obj; + let newObj = Array.isArray(obj) ? [] : {}; + for (let key in obj) { + if (obj.hasOwnProperty(key)) { + newObj[key] = deepCopy(obj[key]); + } + } + return newObj; +} + +// ------------------ 私有方法 ------------------------ +// 处理全局配置 +function _handleDefaultConfig() { + // 确保只加载一次全局配置 + if (configLoaded) return; + // 优先从config.js中读取 + if (zLocalConfig && Object.keys(zLocalConfig).length) { + config = zLocalConfig; + } + // 如果在config.js中读取不到,则尝试到uni.$zp读取 + if (!config && uni.$zp) { + config = uni.$zp.config; + } + // 将config中的短横线写法全部转为驼峰写法,使得读取配置时可以直接通过key去匹配,而非读取每个配置时候再去转,减少不必要的性能开支 + config = config ? Object.keys(config).reduce((result, key) => { + result[_toCamelCase(key)] = config[key]; + return result; + }, {}) : null; + configLoaded = true; +} + +// 时间格式化 +function _timeFormat(time, textMap) { + const date = new Date(time); + const currentDate = new Date(); + // 设置time对应的天,去除时分秒,使得可以直接比较日期 + const dateDay = new Date(time).setHours(0, 0, 0, 0); + // 设置当前的天,去除时分秒,使得可以直接比较日期 + const currentDateDay = new Date().setHours(0, 0, 0, 0); + const disTime = dateDay - currentDateDay; + let dayStr = ''; + const timeStr = _dateTimeFormat(date); + if (disTime === 0) { + dayStr = textMap.today; + } else if (disTime === -86400000) { + dayStr = textMap.yesterday; + } else { + dayStr = _dateDayFormat(date, date.getFullYear() !== currentDate.getFullYear()); + } + return `${dayStr} ${timeStr}`; +} + +// date格式化为年月日 +function _dateDayFormat(date, showYear = true) { + const year = date.getFullYear(); + const month = date.getMonth() + 1; + const day = date.getDate(); + return showYear ? `${year}-${_fullZeroToTwo(month)}-${_fullZeroToTwo(day)}` : `${_fullZeroToTwo(month)}-${_fullZeroToTwo(day)}`; +} + +// data格式化为时分 +function _dateTimeFormat(date) { + const hour = date.getHours(); + const minute = date.getMinutes(); + return `${_fullZeroToTwo(hour)}:${_fullZeroToTwo(minute)}`; +} + +// 不满2位在前面填充0 +function _fullZeroToTwo(str) { + str = str.toString(); + return str.length === 1 ? '0' + str : str; +} + +// 驼峰转短横线 +function _toKebab(value) { + return value.replace(/([A-Z])/g, "-$1").toLowerCase(); +} + +// 短横线转驼峰 +function _toCamelCase(value) { + return value.replace(/-([a-z])/g, (_, group1) => group1.toUpperCase()); +} + + +export default { + gc, + setRefesrherTime, + getRefesrherFormatTimeByKey, + getTouch, + getTouchFromZPaging, + getParent, + convertToPx, + getTime, + getInstanceId, + consoleErr, + delay, + wait, + isPromise, + addUnit, + deepCopy +}; diff --git a/uni_modules/z-paging/components/z-paging/wxs/z-paging-renderjs.js b/uni_modules/z-paging/components/z-paging/wxs/z-paging-renderjs.js index 359f1ac6..1cbc2a2a 100644 --- a/uni_modules/z-paging/components/z-paging/wxs/z-paging-renderjs.js +++ b/uni_modules/z-paging/components/z-paging/wxs/z-paging-renderjs.js @@ -1,67 +1,67 @@ -// [z-paging]使用renderjs在app-vue和h5中对touchmove事件冒泡进行处理 - -import u from '../js/z-paging-utils' -const data = { - startY: 0, - isTouchFromZPaging: false, - isUsePageScroll: false, - isReachedTop: true, - isIosAndH5: false, - useChatRecordMode: false, - appLaunched: false -} - -export default { - mounted() { - if (window) { - this._handleTouch(); - // #ifdef APP-VUE - this.$ownerInstance.callMethod('_handlePageLaunch'); - // #endif - } - }, - methods: { - // 接收逻辑层发送的数据(是否是ios+h5) - renderPropIsIosAndH5Change(newVal) { - if (newVal === -1) return; - data.isIosAndH5 = newVal; - }, - - // 拦截处理touch事件 - _handleTouch() { - if (!window.$zPagingRenderJsInited) { - window.$zPagingRenderJsInited = true; - window.addEventListener('touchstart', this._handleTouchstart, { passive: true }) - window.addEventListener('touchmove', this._handleTouchmove, { passive: false }) - } - }, - // 处理touch开始 - _handleTouchstart(e) { - const touch = u.getTouch(e); - data.startY = touch.touchY; - const touchResult = u.getTouchFromZPaging(e.target); - data.isTouchFromZPaging = touchResult.isFromZp; - data.isUsePageScroll = touchResult.isPageScroll; - data.isReachedTop = touchResult.isReachedTop; - data.useChatRecordMode = touchResult.isUseChatRecordMode; - }, - // 处理touch中 - _handleTouchmove(e) { - const touch = u.getTouch(e); - const moveY = touch.touchY - data.startY; - // 如果是在z-paging内触摸并且(是在顶部位置且是下拉的情况下(或不是聊天记录滚动模式并且在iOS+h5+scroll-view并且是往上拉的情况:避免在此平台中滚动到底部后上拉有个系统灰色遮罩导致列表被短暂锁定的问题)) - // (data.useChatRecordMode ? moveY < 0 : moveY > 0)是为了判断是否是上拉的情况,聊天记录模式列表倒置,因此moveY < 0为上拉 - if (data.isTouchFromZPaging && ((data.isReachedTop && (data.useChatRecordMode ? moveY < 0 : moveY > 0)) || (!data.useChatRecordMode && data.isIosAndH5 && !data.isUsePageScroll && moveY < 0))) { - if (e.cancelable && !e.defaultPrevented) { - // 阻止事件冒泡,以避免在一些平台中下拉刷新时整个page跟着一起下拉&在iOS+h5+scroll-view中在底部上拉有个系统灰色遮罩导致列表被短暂锁定的问题 - e.preventDefault(); - } - } - }, - // 移除touch相关事件监听 - _removeAllEventListener(){ - window.removeEventListener('touchstart'); - window.removeEventListener('touchmove'); - } - } -}; +// [z-paging]使用renderjs在app-vue和h5中对touchmove事件冒泡进行处理 + +import u from '../js/z-paging-utils' +const data = { + startY: 0, + isTouchFromZPaging: false, + isUsePageScroll: false, + isReachedTop: true, + isIosAndH5: false, + useChatRecordMode: false, + appLaunched: false +} + +export default { + mounted() { + if (window) { + this._handleTouch(); + // #ifdef APP-VUE + this.$ownerInstance.callMethod('_handlePageLaunch'); + // #endif + } + }, + methods: { + // 接收逻辑层发送的数据(是否是ios+h5) + renderPropIsIosAndH5Change(newVal) { + if (newVal === -1) return; + data.isIosAndH5 = newVal; + }, + + // 拦截处理touch事件 + _handleTouch() { + if (!window.$zPagingRenderJsInited) { + window.$zPagingRenderJsInited = true; + window.addEventListener('touchstart', this._handleTouchstart, { passive: true }) + window.addEventListener('touchmove', this._handleTouchmove, { passive: false }) + } + }, + // 处理touch开始 + _handleTouchstart(e) { + const touch = u.getTouch(e); + data.startY = touch.touchY; + const touchResult = u.getTouchFromZPaging(e.target); + data.isTouchFromZPaging = touchResult.isFromZp; + data.isUsePageScroll = touchResult.isPageScroll; + data.isReachedTop = touchResult.isReachedTop; + data.useChatRecordMode = touchResult.isUseChatRecordMode; + }, + // 处理touch中 + _handleTouchmove(e) { + const touch = u.getTouch(e); + const moveY = touch.touchY - data.startY; + // 如果是在z-paging内触摸并且(是在顶部位置且是下拉的情况下(或不是聊天记录滚动模式并且在iOS+h5+scroll-view并且是往上拉的情况:避免在此平台中滚动到底部后上拉有个系统灰色遮罩导致列表被短暂锁定的问题)) + // (data.useChatRecordMode ? moveY < 0 : moveY > 0)是为了判断是否是上拉的情况,聊天记录模式列表倒置,因此moveY < 0为上拉 + if (data.isTouchFromZPaging && ((data.isReachedTop && (data.useChatRecordMode ? moveY < 0 : moveY > 0)) || (!data.useChatRecordMode && data.isIosAndH5 && !data.isUsePageScroll && moveY < 0))) { + if (e.cancelable && !e.defaultPrevented) { + // 阻止事件冒泡,以避免在一些平台中下拉刷新时整个page跟着一起下拉&在iOS+h5+scroll-view中在底部上拉有个系统灰色遮罩导致列表被短暂锁定的问题 + e.preventDefault(); + } + } + }, + // 移除touch相关事件监听 + _removeAllEventListener(){ + window.removeEventListener('touchstart'); + window.removeEventListener('touchmove'); + } + } +}; diff --git a/uni_modules/z-paging/components/z-paging/wxs/z-paging-wxs.wxs b/uni_modules/z-paging/components/z-paging/wxs/z-paging-wxs.wxs index ed21959b..b9777ec2 100644 --- a/uni_modules/z-paging/components/z-paging/wxs/z-paging-wxs.wxs +++ b/uni_modules/z-paging/components/z-paging/wxs/z-paging-wxs.wxs @@ -1,382 +1,382 @@ -// [z-paging]微信小程序、QQ小程序、app-vue、h5上使用wxs实现自定义下拉刷新,降低逻辑层与视图层的通信折损,提升性能 - -var currentDis = 0; -var isPCFlag = -1; -var startY = -1; - -// 监听js层传过来的数据 -function propObserver(newVal, oldVal, ownerIns, ins) { - var state = ownerIns.getState() || {}; - state.currentIns = ins; - var dataset = ins.getDataset(); - var loading = dataset.loading == true; - // 如果是下拉刷新结束,更新transform - if (newVal && newVal.indexOf('end') != -1) { - var transition = newVal.split('end')[0]; - _setTransform('translateY(0px)', ins, false, transition); - state.moveDis = 0; - state.oldMoveDis = 0; - currentDis = 0; - } else if (newVal && newVal.indexOf('begin') != -1) { - // 如果是下拉刷新开始,更新transform - var refresherThreshold = ins.getDataset().refresherthreshold; - _setTransformValue(refresherThreshold, ins, state, false); - } -} - -// touch开始 -function touchstart(e, ownerIns) { - var ins = _getIns(ownerIns); - var state = {}; - var dataset = {}; - ownerIns.callMethod('_handleListTouchstart'); - if (ins) { - state = ins.getState(); - dataset = ins.getDataset(); - if (_touchDisabled(e, ins, 0)) return; - } - var isTouchEnded = state.isTouchEnded; - state.oldMoveDis = 0; - var touch = _getTouch(e); - var loading = _isTrue(dataset.loading); - state.startY = touch.touchY; - startY = state.startY; - state.lastTouch = touch; - if (!loading && isTouchEnded) { - state.isTouchmoving = false; - } - state.isTouchEnded = false; - // 通知js层touch开始 - ownerIns.callMethod('_handleRefresherTouchstart', touch); -} - -// touch中 -function touchmove(e, ownerIns) { - var touch = _getTouch(e); - var ins = _getIns(ownerIns); - var dataset = ins.getDataset(); - var refresherThreshold = dataset.refresherthreshold; - var refresherF2Threshold = dataset.refresherf2threshold; - var refresherF2Enabled = _isTrue(dataset.refresherf2enabled); - var isIos = _isTrue(dataset.isios); - var state = ins.getState(); - var watchTouchDirectionChange = _isTrue(dataset.watchtouchdirectionchange); - var moveDisObj = {}; - var moveDis = 0; - var prevent = false; - // 如果需要监听touch方向的改变 - if (watchTouchDirectionChange) { - moveDisObj = _getMoveDis(e, ins); - moveDis = moveDisObj.currentDis; - prevent = moveDisObj.isDown; - var direction = prevent ? 'top' : 'bottom'; - // 确保只在touch方向改变时通知一次js层,而不是touchmove中持续通知 - if (prevent == state.oldTouchDirection && prevent != state.oldEmitedTouchDirection) { - ownerIns.callMethod('_handleTouchDirectionChange', { direction: direction }); - state.oldEmitedTouchDirection = prevent; - } - state.oldTouchDirection = prevent; - } - // 判断是否允许下拉刷新 - if (_touchDisabled(e, ins, 1)) { - _handlePullingDown(state, ownerIns, false); - return true; - } - // 判断下拉刷新的角度是否在要求范围内 - if (!_getAngleIsInRange(e, touch, state, dataset)) { - _handlePullingDown(state, ownerIns, false); - return true; - } - moveDisObj = _getMoveDis(e, ins); - moveDis = moveDisObj.currentDis; - prevent = moveDisObj.isDown; - if (moveDis < 0) { - // moveDis小于0,将transform重置为0 - _setTransformValue(0, ins, state, false); - _handlePullingDown(state, ownerIns, false); - return true; - } - if (prevent && !state.disabledBounce) { - // 如果是用户下拉并且需要触发下拉刷新,需要通知js层将列表禁止滚动,防止在下拉刷新过程中列表也可以滚动导致的下拉刷新偏移过大的问题(在下拉刷新过程中仅通知一次) - ownerIns.callMethod('_handleScrollViewBounce', { bounce: false }); - state.disabledBounce = true; - _handlePullingDown(state, ownerIns, prevent); - return !prevent; - } - // 更新transform - _setTransformValue(moveDis, ins, state, false); - var oldRefresherStatus = state.refresherStatus; - var oldIsTouchmoving = _isTrue(dataset.oldistouchmoving); - var hasTouchmove = _isTrue(dataset.hastouchmove); - var isTouchmoving = state.isTouchmoving; - state.refresherStatus = moveDis >= refresherThreshold ? (refresherF2Enabled && moveDis > refresherF2Threshold ? 'goF2' : 'releaseToRefresh') : 'default'; - if (!isTouchmoving) { - state.isTouchmoving = true; - isTouchmoving = true; - } - if (state.isTouchEnded) { - state.isTouchEnded = false; - } - // 如果需要实时监听下拉位置偏移,则需要实时通知js层,此操作会使wxs层与js层频繁通信从而导致在一些性能较差设备中下拉刷新卡顿 - if (hasTouchmove) { - ownerIns.callMethod('_handleWxsPullingDown', { moveDis: moveDis, diffDis: moveDisObj.diffDis }); - } - // 在下拉刷新状态改变时通知js层 - if (oldRefresherStatus == undefined || oldRefresherStatus != state.refresherStatus || oldIsTouchmoving != isTouchmoving) { - ownerIns.callMethod('_handleRefresherTouchmove', moveDis, touch); - } - _handlePullingDown(state, ownerIns, prevent); - return !prevent; -} - -// touch结束 -function touchend(e, ownerIns) { - var touch = _getTouch(e); - var ins = _getIns(ownerIns); - var dataset = ins.getDataset(); - var state = ins.getState(); - if (state.disabledBounce) { - // 通知js允许列表滚动 - ownerIns.callMethod('_handleScrollViewBounce', { bounce: true }); - state.disabledBounce = false; - } - if (_touchDisabled(e, ins, 2)) return; - state.reachMaxAngle = true; - state.hitReachMaxAngleCount = 0; - state.fixedIsTopHitCount = 0; - if (!state.isTouchmoving) return; - var oldRefresherStatus = state.refresherStatus; - var oldMoveDis = state.moveDis; - var refresherThreshold = ins.getDataset().refresherthreshold; - var moveDis = _getMoveDis(e, ins).currentDis; - if (!(moveDis >= refresherThreshold && oldRefresherStatus === 'releaseToRefresh')) { - state.isTouchmoving = false; - } - // 通知js层touch结束 - ownerIns.callMethod('_handleRefresherTouchend', moveDis); - state.isTouchEnded = true; - if (oldMoveDis < refresherThreshold) return; - var animate = false; - if (moveDis >= refresherThreshold) { - moveDis = refresherThreshold; - animate = true; - } - _setTransformValue(moveDis, ins, state, animate); -} - -// #ifdef H5 -// 判断是否是pc平台 -function isPC() { - if (!navigator) return false; - if (isPCFlag != -1) return isPCFlag; - var agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"]; - isPCFlag = agents.every(function(item) { return navigator.userAgent.indexOf(item) < 0 }); - return isPCFlag; -} - -var movable = false; - -// 在pc平台监听mousedown、mousemove、mouseup等相关事件并转为对应touch事件处理,使得在pc平台也支持通过鼠标进行下拉刷新 - -function mousedown(e, ins) { - if (!isPC()) return; - touchstart(e, ins); - movable = true; -} - -function mousemove(e, ins) { - if (!isPC() || !movable) return; - touchmove(e, ins); -} - -function mouseup(e, ins) { - if (!isPC()) return; - touchend(e, ins); - movable = false; -} - -function mouseleave(e, ins) { - if (!isPC()) return; - movable = false; -} -// #endif - - -// 修改视图层transform -function _setTransformValue(value, ins, state, animate) { - value = value || 0; - if (state.moveDis == value) return; - state.moveDis = value; - _setTransform('translateY(' + value + 'px)', ins, animate, ''); -} - -// 设置视图层transform,直接在视图层操作下拉刷新,使得js层不需要频繁和视图层通信,从而大大提升下拉刷新性能 -function _setTransform(transform, ins, animate, transition) { - var dataset = ins.getDataset(); - if (_isTrue(dataset.refreshernotransform)) return; - transform = transform == 'translateY(0px)' ? 'none' : transform; - ins.requestAnimationFrame(function() { - var stl = { 'transform': transform }; - if (animate) { - stl['transition'] = 'transform .1s linear'; - } - if (transition.length) { - stl['transition'] = transition; - } - ins.setStyle(stl); - }) -} - -// 进一步处理下拉刷新的偏移数据 -function _getMoveDis(e, ins) { - var state = ins.getState(); - var refresherThreshold = parseFloat(ins.getDataset().refresherthreshold); - var refresherOutRate = parseFloat(ins.getDataset().refresheroutrate); - var refresherPullRate = parseFloat(ins.getDataset().refresherpullrate); - var touch = _getTouch(e); - var currentStartY = !state.startY || state.startY == 'NaN' ? startY : state.startY; - var moveDis = touch.touchY - currentStartY; - var oldMoveDis = state.oldMoveDis || 0; - state.oldMoveDis = moveDis; - // 获取当前下拉刷新位置与上次的偏移量 - var diffDis = moveDis - oldMoveDis; - if (diffDis > 0) { - // 对偏移量进行进一步处理,通过refresherPullRate等配置进行约束 - diffDis = diffDis * refresherPullRate; - if (currentDis > refresherThreshold) { - diffDis = diffDis * (1 - refresherOutRate); - } - } - // 控制diffDis过大的情况,比如进入页面突然猛然下拉,此时diffDis不应进行太大的偏移 - diffDis = diffDis > 100 ? diffDis / 100 : (diffDis > 20 ? diffDis / 2.2 : diffDis); - currentDis += diffDis; - currentDis = Math.max(0, currentDis); - return { - currentDis: currentDis, - diffDis: diffDis, - isDown: diffDis > 0 - }; -} - -// 获取经过统一格式包装的当前touch对象 -function _getTouch(e) { - var touch = e; - if (e.touches && e.touches.length) { - touch = e.touches[0]; - } else if (e.changedTouches && e.changedTouches.length) { - touch = e.changedTouches[0]; - } else if (e.datail && e.datail != {}) { - touch = e.datail; - } - return { - touchX: touch.clientX, - touchY: touch.clientY - }; -} - -// 获取当前currentIns -function _getIns(ownerIns) { - var ins = ownerIns.getState().currentIns; - if (!ins) { - ownerIns.callMethod('_handlePropUpdate'); - } - return ins; -} - -// 判断当前状态是否允许下拉刷新 -function _touchDisabled(e, ins, processTag) { - var dataset = ins.getDataset(); - var state = ins.getState(); - var loading = _isTrue(dataset.loading); - var useChatRecordMode = _isTrue(dataset.usechatrecordmode); - var refresherEnabled = _isTrue(dataset.refresherenabled); - var useCustomRefresher = _isTrue(dataset.usecustomrefresher); - var usePageScroll = _isTrue(dataset.usepagescroll); - var pageScrollTop = parseFloat(dataset.pagescrolltop); - var scrollTop = parseFloat(dataset.scrolltop); - var finalScrollTop = usePageScroll ? pageScrollTop : scrollTop; - var fixedIsTop = false; - // 是否要处理滚动到顶部scrollTop不为0时候的容错,为解决在安卓中scroll-view有概率滚动到顶部时scrollTop不为0导致下拉刷新判断异常,但此方案会导致某些情况(例如滚动到距离顶部10px处)下拉抖动,因此改为通过获取zp-scroll-view的节点信息中的scrollTop进行验证的方案 - var handleFaultTolerantMove = false; - if (handleFaultTolerantMove && finalScrollTop == (state.startScrollTop || 0) && finalScrollTop <= 105) { - fixedIsTop = true; - } - var fixedIsTopHitCount = state.fixedIsTopHitCount || 0; - if (fixedIsTop) { - fixedIsTopHitCount ++; - if (fixedIsTopHitCount <= 2) { - fixedIsTop = false; - } - state.fixedIsTopHitCount = fixedIsTopHitCount; - } else { - state.fixedIsTopHitCount = 0; - } - if (handleFaultTolerantMove && processTag === 0) { - state.startScrollTop = finalScrollTop || 0; - } - if (handleFaultTolerantMove && processTag === 2) { - fixedIsTop = true; - } - return loading || useChatRecordMode || !refresherEnabled || !useCustomRefresher || - ((usePageScroll && useCustomRefresher && pageScrollTop > 5) && !fixedIsTop) || - ((!usePageScroll && useCustomRefresher && scrollTop > 5) && !fixedIsTop); -} - -// 判断下拉刷新的角度是否在要求范围内 -function _getAngleIsInRange(e, touch, state, dataset) { - var maxAngle = dataset.refreshermaxangle; - var refresherAecc = _isTrue(dataset.refresheraecc); - var lastTouch = state.lastTouch; - var reachMaxAngle = state.reachMaxAngle; - var moveDis = state.oldMoveDis; - if (!lastTouch) return true; - if (maxAngle >= 0 && maxAngle <= 90 && lastTouch) { - // 考虑下拉刷新手势由水平移动转为垂直方向移动的情况,此时不应当只判断垂直方向角度是否符合要求,应当直接禁止以避免在swiper中使用下拉刷新时,横向切换swiper途中手未离开屏幕还可以下拉刷新的问题 - if ((!moveDis || moveDis < 1) && !refresherAecc && reachMaxAngle != null && !reachMaxAngle) return false; - var x = Math.abs(touch.touchX - lastTouch.touchX); - var y = Math.abs(touch.touchY - lastTouch.touchY); - var z = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); - if ((x || y) && x > 1) { - // 获取下拉刷新前后两次位移的角度 - var angle = Math.asin(y / z) / Math.PI * 180; - if (angle < maxAngle) { - // 如果角度小于配置要求,则return,同时通过hitReachMaxAngleCount控制角度判断的灵敏程度以最大程度兼容各种使用场景 - var hitReachMaxAngleCount = state.hitReachMaxAngleCount || 0; - state.hitReachMaxAngleCount = ++hitReachMaxAngleCount; - if (state.hitReachMaxAngleCount > 2) { - state.lastTouch = touch; - state.reachMaxAngle = false; - } - return false; - } - } - } - state.lastTouch = touch; - return true; -} - -// 进一步处理是否在下拉刷新并通知js层 -function _handlePullingDown(state, ins, onPullingDown) { - var oldOnPullingDown = state.onPullingDown || false; - if (oldOnPullingDown != onPullingDown) { - ins.callMethod('_handleWxsPullingDownStatusChange', onPullingDown); - } - state.onPullingDown = onPullingDown; -} - -// 判断js层传过来的值是否为true -function _isTrue(value) { - value = (typeof(value) === 'string' ? JSON.parse(value) : value) || false; - return value == true || value == 'true'; -} - -module.exports = { - touchstart: touchstart, - touchmove: touchmove, - touchend: touchend, - mousedown: mousedown, - mousemove: mousemove, - mouseup: mouseup, - mouseleave: mouseleave, - propObserver: propObserver -} +// [z-paging]微信小程序、QQ小程序、app-vue、h5上使用wxs实现自定义下拉刷新,降低逻辑层与视图层的通信折损,提升性能 + +var currentDis = 0; +var isPCFlag = -1; +var startY = -1; + +// 监听js层传过来的数据 +function propObserver(newVal, oldVal, ownerIns, ins) { + var state = ownerIns.getState() || {}; + state.currentIns = ins; + var dataset = ins.getDataset(); + var loading = dataset.loading == true; + // 如果是下拉刷新结束,更新transform + if (newVal && newVal.indexOf('end') != -1) { + var transition = newVal.split('end')[0]; + _setTransform('translateY(0px)', ins, false, transition); + state.moveDis = 0; + state.oldMoveDis = 0; + currentDis = 0; + } else if (newVal && newVal.indexOf('begin') != -1) { + // 如果是下拉刷新开始,更新transform + var refresherThreshold = ins.getDataset().refresherthreshold; + _setTransformValue(refresherThreshold, ins, state, false); + } +} + +// touch开始 +function touchstart(e, ownerIns) { + var ins = _getIns(ownerIns); + var state = {}; + var dataset = {}; + ownerIns.callMethod('_handleListTouchstart'); + if (ins) { + state = ins.getState(); + dataset = ins.getDataset(); + if (_touchDisabled(e, ins, 0)) return; + } + var isTouchEnded = state.isTouchEnded; + state.oldMoveDis = 0; + var touch = _getTouch(e); + var loading = _isTrue(dataset.loading); + state.startY = touch.touchY; + startY = state.startY; + state.lastTouch = touch; + if (!loading && isTouchEnded) { + state.isTouchmoving = false; + } + state.isTouchEnded = false; + // 通知js层touch开始 + ownerIns.callMethod('_handleRefresherTouchstart', touch); +} + +// touch中 +function touchmove(e, ownerIns) { + var touch = _getTouch(e); + var ins = _getIns(ownerIns); + var dataset = ins.getDataset(); + var refresherThreshold = dataset.refresherthreshold; + var refresherF2Threshold = dataset.refresherf2threshold; + var refresherF2Enabled = _isTrue(dataset.refresherf2enabled); + var isIos = _isTrue(dataset.isios); + var state = ins.getState(); + var watchTouchDirectionChange = _isTrue(dataset.watchtouchdirectionchange); + var moveDisObj = {}; + var moveDis = 0; + var prevent = false; + // 如果需要监听touch方向的改变 + if (watchTouchDirectionChange) { + moveDisObj = _getMoveDis(e, ins); + moveDis = moveDisObj.currentDis; + prevent = moveDisObj.isDown; + var direction = prevent ? 'top' : 'bottom'; + // 确保只在touch方向改变时通知一次js层,而不是touchmove中持续通知 + if (prevent == state.oldTouchDirection && prevent != state.oldEmitedTouchDirection) { + ownerIns.callMethod('_handleTouchDirectionChange', { direction: direction }); + state.oldEmitedTouchDirection = prevent; + } + state.oldTouchDirection = prevent; + } + // 判断是否允许下拉刷新 + if (_touchDisabled(e, ins, 1)) { + _handlePullingDown(state, ownerIns, false); + return true; + } + // 判断下拉刷新的角度是否在要求范围内 + if (!_getAngleIsInRange(e, touch, state, dataset)) { + _handlePullingDown(state, ownerIns, false); + return true; + } + moveDisObj = _getMoveDis(e, ins); + moveDis = moveDisObj.currentDis; + prevent = moveDisObj.isDown; + if (moveDis < 0) { + // moveDis小于0,将transform重置为0 + _setTransformValue(0, ins, state, false); + _handlePullingDown(state, ownerIns, false); + return true; + } + if (prevent && !state.disabledBounce) { + // 如果是用户下拉并且需要触发下拉刷新,需要通知js层将列表禁止滚动,防止在下拉刷新过程中列表也可以滚动导致的下拉刷新偏移过大的问题(在下拉刷新过程中仅通知一次) + ownerIns.callMethod('_handleScrollViewBounce', { bounce: false }); + state.disabledBounce = true; + _handlePullingDown(state, ownerIns, prevent); + return !prevent; + } + // 更新transform + _setTransformValue(moveDis, ins, state, false); + var oldRefresherStatus = state.refresherStatus; + var oldIsTouchmoving = _isTrue(dataset.oldistouchmoving); + var hasTouchmove = _isTrue(dataset.hastouchmove); + var isTouchmoving = state.isTouchmoving; + state.refresherStatus = moveDis >= refresherThreshold ? (refresherF2Enabled && moveDis > refresherF2Threshold ? 'goF2' : 'releaseToRefresh') : 'default'; + if (!isTouchmoving) { + state.isTouchmoving = true; + isTouchmoving = true; + } + if (state.isTouchEnded) { + state.isTouchEnded = false; + } + // 如果需要实时监听下拉位置偏移,则需要实时通知js层,此操作会使wxs层与js层频繁通信从而导致在一些性能较差设备中下拉刷新卡顿 + if (hasTouchmove) { + ownerIns.callMethod('_handleWxsPullingDown', { moveDis: moveDis, diffDis: moveDisObj.diffDis }); + } + // 在下拉刷新状态改变时通知js层 + if (oldRefresherStatus == undefined || oldRefresherStatus != state.refresherStatus || oldIsTouchmoving != isTouchmoving) { + ownerIns.callMethod('_handleRefresherTouchmove', moveDis, touch); + } + _handlePullingDown(state, ownerIns, prevent); + return !prevent; +} + +// touch结束 +function touchend(e, ownerIns) { + var touch = _getTouch(e); + var ins = _getIns(ownerIns); + var dataset = ins.getDataset(); + var state = ins.getState(); + if (state.disabledBounce) { + // 通知js允许列表滚动 + ownerIns.callMethod('_handleScrollViewBounce', { bounce: true }); + state.disabledBounce = false; + } + if (_touchDisabled(e, ins, 2)) return; + state.reachMaxAngle = true; + state.hitReachMaxAngleCount = 0; + state.fixedIsTopHitCount = 0; + if (!state.isTouchmoving) return; + var oldRefresherStatus = state.refresherStatus; + var oldMoveDis = state.moveDis; + var refresherThreshold = ins.getDataset().refresherthreshold; + var moveDis = _getMoveDis(e, ins).currentDis; + if (!(moveDis >= refresherThreshold && oldRefresherStatus === 'releaseToRefresh')) { + state.isTouchmoving = false; + } + // 通知js层touch结束 + ownerIns.callMethod('_handleRefresherTouchend', moveDis); + state.isTouchEnded = true; + if (oldMoveDis < refresherThreshold) return; + var animate = false; + if (moveDis >= refresherThreshold) { + moveDis = refresherThreshold; + animate = true; + } + _setTransformValue(moveDis, ins, state, animate); +} + +// #ifdef H5 +// 判断是否是pc平台 +function isPC() { + if (!navigator) return false; + if (isPCFlag != -1) return isPCFlag; + var agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"]; + isPCFlag = agents.every(function(item) { return navigator.userAgent.indexOf(item) < 0 }); + return isPCFlag; +} + +var movable = false; + +// 在pc平台监听mousedown、mousemove、mouseup等相关事件并转为对应touch事件处理,使得在pc平台也支持通过鼠标进行下拉刷新 + +function mousedown(e, ins) { + if (!isPC()) return; + touchstart(e, ins); + movable = true; +} + +function mousemove(e, ins) { + if (!isPC() || !movable) return; + touchmove(e, ins); +} + +function mouseup(e, ins) { + if (!isPC()) return; + touchend(e, ins); + movable = false; +} + +function mouseleave(e, ins) { + if (!isPC()) return; + movable = false; +} +// #endif + + +// 修改视图层transform +function _setTransformValue(value, ins, state, animate) { + value = value || 0; + if (state.moveDis == value) return; + state.moveDis = value; + _setTransform('translateY(' + value + 'px)', ins, animate, ''); +} + +// 设置视图层transform,直接在视图层操作下拉刷新,使得js层不需要频繁和视图层通信,从而大大提升下拉刷新性能 +function _setTransform(transform, ins, animate, transition) { + var dataset = ins.getDataset(); + if (_isTrue(dataset.refreshernotransform)) return; + transform = transform == 'translateY(0px)' ? 'none' : transform; + ins.requestAnimationFrame(function() { + var stl = { 'transform': transform }; + if (animate) { + stl['transition'] = 'transform .1s linear'; + } + if (transition.length) { + stl['transition'] = transition; + } + ins.setStyle(stl); + }) +} + +// 进一步处理下拉刷新的偏移数据 +function _getMoveDis(e, ins) { + var state = ins.getState(); + var refresherThreshold = parseFloat(ins.getDataset().refresherthreshold); + var refresherOutRate = parseFloat(ins.getDataset().refresheroutrate); + var refresherPullRate = parseFloat(ins.getDataset().refresherpullrate); + var touch = _getTouch(e); + var currentStartY = !state.startY || state.startY == 'NaN' ? startY : state.startY; + var moveDis = touch.touchY - currentStartY; + var oldMoveDis = state.oldMoveDis || 0; + state.oldMoveDis = moveDis; + // 获取当前下拉刷新位置与上次的偏移量 + var diffDis = moveDis - oldMoveDis; + if (diffDis > 0) { + // 对偏移量进行进一步处理,通过refresherPullRate等配置进行约束 + diffDis = diffDis * refresherPullRate; + if (currentDis > refresherThreshold) { + diffDis = diffDis * (1 - refresherOutRate); + } + } + // 控制diffDis过大的情况,比如进入页面突然猛然下拉,此时diffDis不应进行太大的偏移 + diffDis = diffDis > 100 ? diffDis / 100 : (diffDis > 20 ? diffDis / 2.2 : diffDis); + currentDis += diffDis; + currentDis = Math.max(0, currentDis); + return { + currentDis: currentDis, + diffDis: diffDis, + isDown: diffDis > 0 + }; +} + +// 获取经过统一格式包装的当前touch对象 +function _getTouch(e) { + var touch = e; + if (e.touches && e.touches.length) { + touch = e.touches[0]; + } else if (e.changedTouches && e.changedTouches.length) { + touch = e.changedTouches[0]; + } else if (e.datail && e.datail != {}) { + touch = e.datail; + } + return { + touchX: touch.clientX, + touchY: touch.clientY + }; +} + +// 获取当前currentIns +function _getIns(ownerIns) { + var ins = ownerIns.getState().currentIns; + if (!ins) { + ownerIns.callMethod('_handlePropUpdate'); + } + return ins; +} + +// 判断当前状态是否允许下拉刷新 +function _touchDisabled(e, ins, processTag) { + var dataset = ins.getDataset(); + var state = ins.getState(); + var loading = _isTrue(dataset.loading); + var useChatRecordMode = _isTrue(dataset.usechatrecordmode); + var refresherEnabled = _isTrue(dataset.refresherenabled); + var useCustomRefresher = _isTrue(dataset.usecustomrefresher); + var usePageScroll = _isTrue(dataset.usepagescroll); + var pageScrollTop = parseFloat(dataset.pagescrolltop); + var scrollTop = parseFloat(dataset.scrolltop); + var finalScrollTop = usePageScroll ? pageScrollTop : scrollTop; + var fixedIsTop = false; + // 是否要处理滚动到顶部scrollTop不为0时候的容错,为解决在安卓中scroll-view有概率滚动到顶部时scrollTop不为0导致下拉刷新判断异常,但此方案会导致某些情况(例如滚动到距离顶部10px处)下拉抖动,因此改为通过获取zp-scroll-view的节点信息中的scrollTop进行验证的方案 + var handleFaultTolerantMove = false; + if (handleFaultTolerantMove && finalScrollTop == (state.startScrollTop || 0) && finalScrollTop <= 105) { + fixedIsTop = true; + } + var fixedIsTopHitCount = state.fixedIsTopHitCount || 0; + if (fixedIsTop) { + fixedIsTopHitCount ++; + if (fixedIsTopHitCount <= 2) { + fixedIsTop = false; + } + state.fixedIsTopHitCount = fixedIsTopHitCount; + } else { + state.fixedIsTopHitCount = 0; + } + if (handleFaultTolerantMove && processTag === 0) { + state.startScrollTop = finalScrollTop || 0; + } + if (handleFaultTolerantMove && processTag === 2) { + fixedIsTop = true; + } + return loading || useChatRecordMode || !refresherEnabled || !useCustomRefresher || + ((usePageScroll && useCustomRefresher && pageScrollTop > 5) && !fixedIsTop) || + ((!usePageScroll && useCustomRefresher && scrollTop > 5) && !fixedIsTop); +} + +// 判断下拉刷新的角度是否在要求范围内 +function _getAngleIsInRange(e, touch, state, dataset) { + var maxAngle = dataset.refreshermaxangle; + var refresherAecc = _isTrue(dataset.refresheraecc); + var lastTouch = state.lastTouch; + var reachMaxAngle = state.reachMaxAngle; + var moveDis = state.oldMoveDis; + if (!lastTouch) return true; + if (maxAngle >= 0 && maxAngle <= 90 && lastTouch) { + // 考虑下拉刷新手势由水平移动转为垂直方向移动的情况,此时不应当只判断垂直方向角度是否符合要求,应当直接禁止以避免在swiper中使用下拉刷新时,横向切换swiper途中手未离开屏幕还可以下拉刷新的问题 + if ((!moveDis || moveDis < 1) && !refresherAecc && reachMaxAngle != null && !reachMaxAngle) return false; + var x = Math.abs(touch.touchX - lastTouch.touchX); + var y = Math.abs(touch.touchY - lastTouch.touchY); + var z = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); + if ((x || y) && x > 1) { + // 获取下拉刷新前后两次位移的角度 + var angle = Math.asin(y / z) / Math.PI * 180; + if (angle < maxAngle) { + // 如果角度小于配置要求,则return,同时通过hitReachMaxAngleCount控制角度判断的灵敏程度以最大程度兼容各种使用场景 + var hitReachMaxAngleCount = state.hitReachMaxAngleCount || 0; + state.hitReachMaxAngleCount = ++hitReachMaxAngleCount; + if (state.hitReachMaxAngleCount > 2) { + state.lastTouch = touch; + state.reachMaxAngle = false; + } + return false; + } + } + } + state.lastTouch = touch; + return true; +} + +// 进一步处理是否在下拉刷新并通知js层 +function _handlePullingDown(state, ins, onPullingDown) { + var oldOnPullingDown = state.onPullingDown || false; + if (oldOnPullingDown != onPullingDown) { + ins.callMethod('_handleWxsPullingDownStatusChange', onPullingDown); + } + state.onPullingDown = onPullingDown; +} + +// 判断js层传过来的值是否为true +function _isTrue(value) { + value = (typeof(value) === 'string' ? JSON.parse(value) : value) || false; + return value == true || value == 'true'; +} + +module.exports = { + touchstart: touchstart, + touchmove: touchmove, + touchend: touchend, + mousedown: mousedown, + mousemove: mousemove, + mouseup: mouseup, + mouseleave: mouseleave, + propObserver: propObserver +} diff --git a/uni_modules/z-paging/components/z-paging/z-paging.vue b/uni_modules/z-paging/components/z-paging/z-paging.vue index 6afa0faf..00b64943 100644 --- a/uni_modules/z-paging/components/z-paging/z-paging.vue +++ b/uni_modules/z-paging/components/z-paging/z-paging.vue @@ -1,345 +1,345 @@ - - - - - - - - - - - - + + +