1. 修复badge尺寸无效问题

2. 添加noticebar的多个参数
3. 改进http拦截器实现和逻辑
4. 文档更新等
parent 2bfded3d
...@@ -2,29 +2,13 @@ ...@@ -2,29 +2,13 @@
export default { export default {
// 此处globalData为了演示其作用,不是uView框架的一部分 // 此处globalData为了演示其作用,不是uView框架的一部分
globalData: { globalData: {
username: '竹青' username: '11'
}, },
async onLaunch() { onLaunch() {
this.$u.http.setConfig({ // 1.1.0版本之前关于http拦截器代码,已平滑移动到/common/http.interceptor.js中
baseUrl: 'https://api.youzixy.com', // 注意,需要在/main.js中实例化Vue之后引入如下(详见文档说明):
// 如果将此值设置为true,拦截回调中将会返回服务端返回的所有数据response,而不是response.data // import httpInterceptor from '@/common/http.interceptor.js'
// 设置为true后,就需要在this.$u.http.interceptor.response进行多一次的判断,请打印查看具体值 // Vue.use(httpInterceptor, app)
// originalData: true,
});
// 请求拦截,配置Token等参数
this.$u.http.interceptor.request = (config) => {
config.header.Token = 'xxxxxx';
return config;
}
// 响应拦截,判断状态码是否通过
this.$u.http.interceptor.response = (res) => {
// 如果把originalData设置为了true,这里得到将会是服务器返回的所有的原始数据
// 判断可能变成了res.statueCode,或者res.data.code之类的,请打印查看结果
if(res.code == 200) {
// 如果把originalData设置为了true,这里return回什么,this.$u.post的then回调中就会得到什么
return res.data;
} else return false;
}
}, },
} }
</script> </script>
......
// 这里的vm,就是我们在vue文件里面的this,所以我们能在这里获取vuex的变量,比如存放在里面的token
// 同时,我们也可以在此使用getApp().globalData,如果你把token放在getApp().globalData的话,也是可以使用的
const install = (Vue, vm) => {
Vue.prototype.$u.http.setConfig({
baseUrl: 'https://api.youzixy.com',
// 如果将此值设置为true,拦截回调中将会返回服务端返回的所有数据response,而不是response.data
// 设置为true后,就需要在this.$u.http.interceptor.response进行多一次的判断,请打印查看具体值
// originalData: true,
});
// 请求拦截,配置Token等参数
Vue.prototype.$u.http.interceptor.request = (config) => {
config.header.Token = 'xxxxxx';
// 方式一,存放在vuex的token,假设使用了uView封装的vuex方式,见:https://uviewui.com/components/globalVariable.html
// config.header.token = vm.token;
// 方式二,如果没有使用uView封装的vuex方法,那么需要使用$store.state获取
// config.header.token = vm.$store.state.token;
// 方式三,如果token放在了globalData,通过getApp().globalData获取
// config.header.token = getApp().globalData.username;
// 方式四,如果token放在了Storage本地存储中,拦截是每次请求都执行的,所以哪怕您重新登录修改了Storage,下一次的请求将会是最新值
// const token = uni.getStorageSync('token');
// config.header.token = token;
return config;
}
// 响应拦截,判断状态码是否通过
Vue.prototype.$u.http.interceptor.response = (res) => {
// 如果把originalData设置为了true,这里得到将会是服务器返回的所有的原始数据
// 判断可能变成了res.statueCode,或者res.data.code之类的,请打印查看结果
if(res.code == 200) {
// 如果把originalData设置为了true,这里return回什么,this.$u.post的then回调中就会得到什么
return res.data;
} else return false;
}
}
export default {
install
}
\ No newline at end of file
...@@ -31,3 +31,8 @@ const app = new Vue({ ...@@ -31,3 +31,8 @@ const app = new Vue({
...App ...App
}) })
app.$mount() app.$mount()
// http拦截器
import httpInterceptor from '@/common/http.interceptor.js'
Vue.use(httpInterceptor, app)
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
</view> </view>
<view class="u-config-item"> <view class="u-config-item">
<view class="u-item-title">主题</view> <view class="u-item-title">主题</view>
<u-subsection vibrateShort :current="3" :list="['primary', 'success', 'error', 'warning', 'info']" @change="typeChange"></u-subsection> <u-subsection vibrateShort :current="3" :list="['primary', 'success', 'error', 'warning', 'none']" @change="typeChange"></u-subsection>
</view> </view>
<view class="u-config-item"> <view class="u-config-item">
<view class="u-item-title">滚动模式</view> <view class="u-item-title">滚动模式</view>
...@@ -63,9 +63,15 @@ ...@@ -63,9 +63,15 @@
current: 0 current: 0
} }
}, },
onLoad() {
setTimeout(() => {
this.list = [];
}, 3000)
},
methods: { methods: {
typeChange(index) { typeChange(index) {
this.type = index == 0 ? 'primary' : index == 1 ? 'success' : index == 2 ? 'error' : index == 3 ? 'warning' : 'info'; let type = ['primary', 'success', 'error', 'warning', 'none'];
this.type = type[index];
}, },
modeChange(index) { modeChange(index) {
this.current = index; this.current = index;
......
<template> <template>
<view class="u-demo"> <view class="u-demo">
<view class="u-demo-wrap"> <view class="u-demo-wrap">
<view class="u-demo-title">演示效果</view> <view class="u-demo-title">演示效果</view>
<view class="u-demo-area"> <view class="u-demo-area">
<u-toast ref="uToast"></u-toast> <u-toast ref="uToast"></u-toast>
<view class="u-no-demo-here">如果使用text-align: center对齐,数字滚动期间可能会抖动,见文档说明</view> <view class="u-no-demo-here">如果使用text-align: center对齐,数字滚动期间可能会抖动,见文档说明</view>
<view class="count-to-demo"> <view class="count-to-demo">
<u-count-to <u-count-to
class="count-to" class="count-to"
:useEasing="useEasing" :useEasing="useEasing"
ref="uCountTo" ref="uCountTo"
:autoplay="autoplay" :autoplay="autoplay"
:startVal="startVal" :startVal="startVal"
:endVal="endVal" :endVal="endVal"
:duration="duration" :duration="duration"
:decimals="decimals" :decimals="decimals"
:fontWeight="fontWeight" :bold="bold"
@end="end" @end="end"
></u-count-to> ></u-count-to>
</view> </view>
</view> </view>
</view> </view>
<view class="u-config-wrap"> <view class="u-config-wrap">
<view class="u-config-title u-border-bottom">参数配置</view> <view class="u-config-title u-border-bottom">参数配置</view>
<view class="u-config-item"> <view class="u-config-item">
<view class="u-item-title">状态</view> <view class="u-item-title">状态</view>
<u-subsection <u-subsection vibrateShort :current="current" :list="['启动', '暂停', '继续', '重置']" @change="statusChange"></u-subsection>
vibrateShort </view>
:current="current" <view class="u-config-item">
:list="['启动', '暂停', '继续', '重置']" <view class="u-item-title">目标值</view>
@change="statusChange" <u-subsection vibrateShort :list="[608, 5604, 45617]" @change="endValChange"></u-subsection>
></u-subsection> </view>
</view> <view class="u-config-item">
<view class="u-config-item"> <view class="u-item-title">滚动时间</view>
<view class="u-item-title">目标值</view> <u-subsection vibrateShort current="1" :list="[1000, 2000, 3000]" @change="durationChange"></u-subsection>
<u-subsection vibrateShort :list="[608, 5604, 45617]" @change="endValChange"></u-subsection> </view>
</view> <view class="u-config-item">
<view class="u-config-item"> <view class="u-item-title">显示小数</view>
<view class="u-item-title">滚动时间</view> <u-subsection vibrateShort current="1" :list="['是', '否']" @change="decimalsChange"></u-subsection>
<u-subsection vibrateShort current="1" :list="[1000, 2000, 3000]" @change="durationChange"></u-subsection> </view>
</view> <view class="u-config-item">
<view class="u-config-item"> <view class="u-item-title">字体加粗</view>
<view class="u-item-title">显示小数</view> <u-subsection vibrateShort current="1" :list="['是', '否']" @change="boldChange"></u-subsection>
<u-subsection vibrateShort current="1" :list="['是', '否']" @change="decimalsChange"></u-subsection> </view>
</view> </view>
<view class="u-config-item"> </view>
<view class="u-item-title">字体加粗</view>
<u-subsection
vibrateShort
current="1"
:list="['normal', 'bold', 'bolder','lighter']"
@change="fontWidthChange"
></u-subsection>
</view>
</view>
</view>
</template> </template>
<script> <script>
export default { export default {
data() { data() {
return { return {
startVal: 0, startVal: 0,
endVal: 608, endVal: 608,
separator: ",", separator: ',',
decimals: 0, decimals: 0,
duration: 2000, duration: 2000,
autoplay: false, autoplay: false,
useEasing: true, useEasing: true,
current: 3, current: 3,
isStop: false, // 如果开没启动前,不允许点击状态选项的"继续"按钮,否则会导致显示NaN isStop: false, // 如果开没启动前,不允许点击状态选项的"继续"按钮,否则会导致显示NaN
fontWeight: 400 bold: false
}; };
}, },
methods: { methods: {
endValChange(index) { endValChange(index) {
this.endVal = index == 0 ? 608 : index == 1 ? 5604 : 45617; this.endVal = index == 0 ? 608 : index == 1 ? 5604 : 45617;
this.reset(); this.reset();
this.start(); this.start();
}, },
durationChange(index) { durationChange(index) {
this.duration = index == 0 ? 1000 : index == 1 ? 2000 : 3000; this.duration = index == 0 ? 1000 : index == 1 ? 2000 : 3000;
}, },
fontWidthChange(index) { boldChange(index) {
let arr = ["normal", "bold", "bolder", "lighter"]; this.bold = !!!index;
this.fontWeight = arr[index]; },
}, decimalsChange(index) {
decimalsChange(index) { this.decimals = index == 0 ? 2 : 0;
this.decimals = index == 0 ? 2 : 0; },
}, statusChange(index) {
statusChange(index) { this.current = index;
this.current = index; if (index == 0) {
if (index == 0) { this.start();
this.start(); } else if (index == 1) {
} else if (index == 1) { this.stop();
this.stop(); } else if (index == 2) {
} else if (index == 2) { this.resume();
this.resume(); } else {
} else { this.reset();
this.reset(); }
} },
}, end() {
end() { this.current = 3;
this.current = 3; this.$refs.uToast.show({
this.$refs.uToast.show({ type: 'warning',
type: "warning", title: '滚动结束'
title: "滚动结束" });
}); },
}, start() {
start() { this.current = 0;
this.current = 0; this.isStop = true;
this.isStop = true; this.$refs.uCountTo.start();
this.$refs.uCountTo.start(); },
}, stop() {
stop() { this.$refs.uCountTo.stop();
this.$refs.uCountTo.stop(); },
}, resume() {
resume() { if (!this.isStop) {
if (!this.isStop) { this.$refs.uToast.show({
this.$refs.uToast.show({ type: 'error',
type: "error", title: '请开始并暂停后才能继续'
title: "请开始并暂停后才能继续" });
}); this.$nextTick(() => {
this.$nextTick(() => { this.current = 3;
this.current = 3; });
}); return;
return; }
} this.$refs.uCountTo.resume();
this.$refs.uCountTo.resume(); },
}, reset() {
reset() { this.$refs.uCountTo.reset();
this.$refs.uCountTo.reset(); }
} }
}
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.count-to-demo { .count-to-demo {
text-align: center; text-align: center;
} }
</style> </style>
...@@ -90,6 +90,10 @@ ...@@ -90,6 +90,10 @@
style.right = this.offset[1] + 'rpx'; style.right = this.offset[1] + 'rpx';
style.transform = "translateY(0) translateX(0)"; style.transform = "translateY(0) translateX(0)";
} }
// 如果尺寸为mini,后接上scal()
if(this.size == 'mini') {
style.transform = style.transform + " scale(0.8)";
}
return style; return style;
}, },
// isDot类型时,不显示文字 // isDot类型时,不显示文字
......
...@@ -2,7 +2,8 @@ ...@@ -2,7 +2,8 @@
<view <view
class="u-notice-bar" class="u-notice-bar"
:style="{ :style="{
background: computeBgColor background: computeBgColor,
padding: padding
}" }"
> >
<view class="u-icon-wrap"> <view class="u-icon-wrap">
...@@ -109,7 +110,7 @@ export default { ...@@ -109,7 +110,7 @@ export default {
type: String, type: String,
default: 'horizontal' default: 'horizontal'
}, },
// 播放状态,paly-播放,paused-暂停 // 播放状态,play-播放,paused-暂停
playState: { playState: {
type: String, type: String,
default: 'play' default: 'play'
...@@ -119,12 +120,18 @@ export default { ...@@ -119,12 +120,18 @@ export default {
disableTouch: { disableTouch: {
type: Boolean, type: Boolean,
default: true default: true
},
// 通知的边距
padding: {
type: [Number, String],
default: '18rpx 24rpx'
} }
}, },
computed: { computed: {
// 计算字体颜色,如果没有自定义的,就用uview主题颜色 // 计算字体颜色,如果没有自定义的,就用uview主题颜色
computeColor() { computeColor() {
if (this.color) return this.color; if (this.color) return this.color;
else if(this.type == 'none') return this.$u.color['contentColor'];
else return this.$u.color[this.type]; else return this.$u.color[this.type];
}, },
// 垂直或者水平滚动 // 垂直或者水平滚动
...@@ -135,7 +142,8 @@ export default { ...@@ -135,7 +142,8 @@ export default {
// 计算背景颜色 // 计算背景颜色
computeBgColor() { computeBgColor() {
if (this.bgColor) return this.bgColor; if (this.bgColor) return this.bgColor;
return this.$u.color[this.type + 'Light']; else if(this.type == 'none') return 'transparent';
else return this.$u.color[this.type + 'Light'];
} }
}, },
data() { data() {
......
...@@ -60,7 +60,7 @@ export default { ...@@ -60,7 +60,7 @@ export default {
default: 0 default: 0
}, },
// 是否自动开始倒计时 // 是否自动开始倒计时
autopaly: { autoplay: {
type: Boolean, type: Boolean,
default: true default: true
}, },
...@@ -175,7 +175,7 @@ export default { ...@@ -175,7 +175,7 @@ export default {
}, },
mounted() { mounted() {
// 如果自动倒计时 // 如果自动倒计时
this.autopaly && this.timestamp && this.start(); this.autoplay && this.timestamp && this.start();
}, },
methods: { methods: {
// 倒计时 // 倒计时
......
<template> <template>
<view <view
class="u-count-num" class="u-count-num"
:style="{ :style="{
fontSize: fontSize + 'rpx', fontSize: fontSize + 'rpx',
fontWeight:fontWeight, fontWeight: bold ? 'bold' : 'normal',
color: color color: color
}" }"
>{{ displayValue }}</view> >
{{ displayValue }}
</view>
</template> </template>
<script> <script>
export default { export default {
props: { props: {
// 开始的数值,默认从0增长到某一个数 // 开始的数值,默认从0增长到某一个数
startVal: { startVal: {
type: [Number, String], type: [Number, String],
default: 0 default: 0
}, },
// 要滚动的目标数值,必须 // 要滚动的目标数值,必须
endVal: { endVal: {
type: [Number, String], type: [Number, String],
default: 0, default: 0,
required: true required: true
}, },
// 滚动到目标数值的动画持续时间,单位为毫秒(ms) // 滚动到目标数值的动画持续时间,单位为毫秒(ms)
duration: { duration: {
type: [Number, String], type: [Number, String],
default: 2000 default: 2000
}, },
// 设置数值后是否自动开始滚动 // 设置数值后是否自动开始滚动
autoplay: { autoplay: {
type: Boolean, type: Boolean,
default: true default: true
}, },
// 要显示的小数位数 // 要显示的小数位数
decimals: { decimals: {
type: [Number, String], type: [Number, String],
default: 0 default: 0
}, },
// 是否在即将到达目标数值的时候,使用缓慢滚动的效果 // 是否在即将到达目标数值的时候,使用缓慢滚动的效果
useEasing: { useEasing: {
type: Boolean, type: Boolean,
default: true default: true
}, },
// 十进制分割 // 十进制分割
decimal: { decimal: {
type: [Number, String], type: [Number, String],
default: "." default: '.'
}, },
// 字体颜色 // 字体颜色
color: { color: {
type: String, type: String,
default: "#303133" default: '#303133'
}, },
// 字体大小 // 字体大小
fontSize: { fontSize: {
type: [Number, String], type: [Number, String],
default: 50 default: 50
}, },
// 字体粗细 // 是否加粗字体
fontWeight: { bold: {
type: [Number, String], type: Boolean,
default: 400 default: false
}, },
// 千位分隔符,类似金额的分割(¥23,321.05中的",") // 千位分隔符,类似金额的分割(¥23,321.05中的",")
separator: { separator: {
type: String, type: String,
default: "" default: ''
} }
}, },
data() { data() {
return { return {
localStartVal: this.startVal, localStartVal: this.startVal,
displayValue: this.formatNumber(this.startVal), displayValue: this.formatNumber(this.startVal),
printVal: null, printVal: null,
paused: false, // 是否暂停 paused: false, // 是否暂停
localDuration: Number(this.duration), localDuration: Number(this.duration),
startTime: null, // 开始的时间 startTime: null, // 开始的时间
timestamp: null, // 时间戳 timestamp: null, // 时间戳
remaining: null, // 停留的时间 remaining: null, // 停留的时间
rAF: null, rAF: null,
lastTime: 0 // 上一次的时间 lastTime: 0 // 上一次的时间
}; };
}, },
computed: { computed: {
countDown() { countDown() {
return this.startVal > this.endVal; return this.startVal > this.endVal;
} }
}, },
watch: { watch: {
startVal() { startVal() {
this.autoplay && this.start(); this.autoplay && this.start();
}, },
endVal() { endVal() {
this.autoplay && this.start(); this.autoplay && this.start();
} }
}, },
mounted() { mounted() {
this.autoplay && this.start(); this.autoplay && this.start();
}, },
methods: { methods: {
easingFn(t, b, c, d) { easingFn(t, b, c, d) {
return (c * (-Math.pow(2, (-10 * t) / d) + 1) * 1024) / 1023 + b; return (c * (-Math.pow(2, (-10 * t) / d) + 1) * 1024) / 1023 + b;
}, },
requestAnimationFrame(callback) { requestAnimationFrame(callback) {
const currTime = new Date().getTime(); const currTime = new Date().getTime();
// 为了使setTimteout的尽可能的接近每秒60帧的效果 // 为了使setTimteout的尽可能的接近每秒60帧的效果
const timeToCall = Math.max(0, 16 - (currTime - this.lastTime)); const timeToCall = Math.max(0, 16 - (currTime - this.lastTime));
const id = setTimeout(() => { const id = setTimeout(() => {
callback(currTime + timeToCall); callback(currTime + timeToCall);
}, timeToCall); }, timeToCall);
this.lastTime = currTime + timeToCall; this.lastTime = currTime + timeToCall;
return id; return id;
}, },
cancelAnimationFrame(id) { cancelAnimationFrame(id) {
clearTimeout(id); clearTimeout(id);
}, },
// 开始滚动数字 // 开始滚动数字
start() { start() {
this.localStartVal = this.startVal; this.localStartVal = this.startVal;
this.startTime = null; this.startTime = null;
this.localDuration = this.duration; this.localDuration = this.duration;
this.paused = false; this.paused = false;
this.rAF = this.requestAnimationFrame(this.count); this.rAF = this.requestAnimationFrame(this.count);
}, },
// 暂定状态,重新再开始滚动;或者滚动状态下,暂停 // 暂定状态,重新再开始滚动;或者滚动状态下,暂停
reStart() { reStart() {
if (this.paused) { if (this.paused) {
this.resume(); this.resume();
this.paused = false; this.paused = false;
} else { } else {
this.stop(); this.stop();
this.paused = true; this.paused = true;
} }
}, },
// 暂停 // 暂停
stop() { stop() {
this.cancelAnimationFrame(this.rAF); this.cancelAnimationFrame(this.rAF);
}, },
// 重新开始(暂停的情况下) // 重新开始(暂停的情况下)
resume() { resume() {
this.startTime = null; this.startTime = null;
this.localDuration = this.remaining; this.localDuration = this.remaining;
this.localStartVal = this.printVal; this.localStartVal = this.printVal;
this.requestAnimationFrame(this.count); this.requestAnimationFrame(this.count);
}, },
// 重置 // 重置
reset() { reset() {
this.startTime = null; this.startTime = null;
this.cancelAnimationFrame(this.rAF); this.cancelAnimationFrame(this.rAF);
this.displayValue = this.formatNumber(this.startVal); this.displayValue = this.formatNumber(this.startVal);
}, },
count(timestamp) { count(timestamp) {
if (!this.startTime) this.startTime = timestamp; if (!this.startTime) this.startTime = timestamp;
this.timestamp = timestamp; this.timestamp = timestamp;
const progress = timestamp - this.startTime; const progress = timestamp - this.startTime;
this.remaining = this.localDuration - progress; this.remaining = this.localDuration - progress;
if (this.useEasing) { if (this.useEasing) {
if (this.countDown) { if (this.countDown) {
this.printVal = this.printVal = this.localStartVal - this.easingFn(progress, 0, this.localStartVal - this.endVal, this.localDuration);
this.localStartVal - } else {
this.easingFn( this.printVal = this.easingFn(progress, this.localStartVal, this.endVal - this.localStartVal, this.localDuration);
progress, }
0, } else {
this.localStartVal - this.endVal, if (this.countDown) {
this.localDuration this.printVal = this.localStartVal - (this.localStartVal - this.endVal) * (progress / this.localDuration);
); } else {
} else { this.printVal = this.localStartVal + (this.endVal - this.localStartVal) * (progress / this.localDuration);
this.printVal = this.easingFn( }
progress, }
this.localStartVal, if (this.countDown) {
this.endVal - this.localStartVal, this.printVal = this.printVal < this.endVal ? this.endVal : this.printVal;
this.localDuration } else {
); this.printVal = this.printVal > this.endVal ? this.endVal : this.printVal;
} }
} else { this.displayValue = this.formatNumber(this.printVal);
if (this.countDown) { if (progress < this.localDuration) {
this.printVal = this.rAF = this.requestAnimationFrame(this.count);
this.localStartVal - } else {
(this.localStartVal - this.endVal) * this.$emit('end');
(progress / this.localDuration); }
} else { },
this.printVal = // 判断是否数字
this.localStartVal + isNumber(val) {
(this.endVal - this.localStartVal) * return !isNaN(parseFloat(val));
(progress / this.localDuration); },
} formatNumber(num) {
} num = num.toFixed(Number(this.decimals));
if (this.countDown) { num += '';
this.printVal = const x = num.split('.');
this.printVal < this.endVal ? this.endVal : this.printVal; let x1 = x[0];
} else { const x2 = x.length > 1 ? this.decimal + x[1] : '';
this.printVal = const rgx = /(\d+)(\d{3})/;
this.printVal > this.endVal ? this.endVal : this.printVal; if (this.separator && !this.isNumber(this.separator)) {
} while (rgx.test(x1)) {
this.displayValue = this.formatNumber(this.printVal); x1 = x1.replace(rgx, '$1' + this.separator + '$2');
if (progress < this.localDuration) { }
this.rAF = this.requestAnimationFrame(this.count); }
} else { return x1 + x2;
this.$emit("end"); },
} destroyed() {
}, this.cancelAnimationFrame(this.rAF);
// 判断是否数字 }
isNumber(val) { }
return !isNaN(parseFloat(val));
},
formatNumber(num) {
num = num.toFixed(Number(this.decimals));
num += "";
const x = num.split(".");
let x1 = x[0];
const x2 = x.length > 1 ? this.decimal + x[1] : "";
const rgx = /(\d+)(\d{3})/;
if (this.separator && !this.isNumber(this.separator)) {
while (rgx.test(x1)) {
x1 = x1.replace(rgx, "$1" + this.separator + "$2");
}
}
return x1 + x2;
},
destroyed() {
this.cancelAnimationFrame(this.rAF);
}
}
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.u-count-num { .u-count-num {
display: inline-block; display: inline-block;
text-align: center; text-align: center;
} }
</style> </style>
...@@ -36,7 +36,7 @@ export default { ...@@ -36,7 +36,7 @@ export default {
text: '无权限' text: '无权限'
}, },
history: { history: {
image: 'data:image/png;base64,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', image: 'data:image/png;base64,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',
text: '无历史记录' text: '无历史记录'
}, },
news: { news: {
......
<template> <template>
<view :id="elId" class="u-grid" :class="{'u-border-top u-border-left': border}"><slot /></view> <view :id="elId" class="u-grid" :class="{'u-border-top u-border-left': border}" :style="[gridStyle]"><slot /></view>
</template> </template>
<script> <script>
...@@ -20,6 +20,11 @@ export default { ...@@ -20,6 +20,11 @@ export default {
type: Boolean, type: Boolean,
default: false default: false
}, },
// 宫格对齐方式,表现为数量少的时候,靠左,居中,还是靠右
align: {
type: String,
default: 'left'
}
}, },
data() { data() {
return { return {
...@@ -38,6 +43,25 @@ export default { ...@@ -38,6 +43,25 @@ export default {
mounted() { mounted() {
this.getGridRect(); this.getGridRect();
}, },
computed: {
// 宫格对齐方式
gridStyle() {
let style = {};
switch(this.align) {
case 'left':
style.justifyContent = 'flex-start';
break;
case 'center':
style.justifyContent = 'center';
break;
case 'right':
style.justifyContent = 'flex-end';
break;
default: style.justifyContent = 'flex-start';
};
return style;
}
},
methods: { methods: {
click(index) { click(index) {
this.$emit('click', index); this.$emit('click', index);
...@@ -58,6 +82,5 @@ export default { ...@@ -58,6 +82,5 @@ export default {
width: 100%; width: 100%;
align-items: center; align-items: center;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: center;
} }
</style> </style>
<template> <template>
<view class="" v-if="show"> <view class="u-notice-bar-wrap" v-if="isShow" :style="{
borderRadius: borderRadius + 'rpx',
}">
<block v-if="mode == 'horizontal' && isCircular"> <block v-if="mode == 'horizontal' && isCircular">
<u-row-notice <u-row-notice
:type="type" :type="type"
...@@ -13,6 +15,7 @@ ...@@ -13,6 +15,7 @@
:fontSize="fontSize" :fontSize="fontSize"
:speed="speed" :speed="speed"
:playState="playState" :playState="playState"
:padding="padding"
@getMore="getMore" @getMore="getMore"
@close="close" @close="close"
@click="click" @click="click"
...@@ -32,6 +35,7 @@ ...@@ -32,6 +35,7 @@
:fontSize="fontSize" :fontSize="fontSize"
:duration="duration" :duration="duration"
:playState="playState" :playState="playState"
:padding="padding"
@getMore="getMore" @getMore="getMore"
@close="close" @close="close"
@click="click" @click="click"
...@@ -116,7 +120,7 @@ export default { ...@@ -116,7 +120,7 @@ export default {
type: Boolean, type: Boolean,
default: true default: true
}, },
// 播放状态,paly-播放,paused-暂停 // 播放状态,play-播放,paused-暂停
playState: { playState: {
type: String, type: String,
default: 'play' default: 'play'
...@@ -126,6 +130,28 @@ export default { ...@@ -126,6 +130,28 @@ export default {
disableTouch: { disableTouch: {
type: Boolean, type: Boolean,
default: true default: true
},
// 滚动通知设置圆角
borderRadius: {
type: [Number, String],
default: 0
},
// 通知的边距
padding: {
type: [Number, String],
default: '18rpx 24rpx'
},
// list列表为空时,是否显示组件
noListHidden: {
type: Boolean,
default: true
}
},
computed: {
// 如果设置show为false,或者设置了noListHidden为true,且list长度又为零的话,隐藏组件
isShow() {
if(this.show == false || (this.noListHidden == true && this.list.length == 0)) return false;
else return true;
} }
}, },
methods: { methods: {
...@@ -150,6 +176,10 @@ export default { ...@@ -150,6 +176,10 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.u-notice-bar-wrap {
overflow: hidden;
}
.u-notice-bar { .u-notice-bar {
padding: 18rpx 24rpx; padding: 18rpx 24rpx;
overflow: hidden; overflow: hidden;
......
...@@ -2,7 +2,10 @@ ...@@ -2,7 +2,10 @@
<view <view
v-if="show" v-if="show"
class="u-notice-bar" class="u-notice-bar"
:style="{background: computeBgColor}" :style="{
background: computeBgColor,
padding: padding
}"
> >
<view class="u-direction-row"> <view class="u-direction-row">
<view class="u-icon-wrap"> <view class="u-icon-wrap">
...@@ -40,7 +43,8 @@ export default { ...@@ -40,7 +43,8 @@ export default {
return []; return [];
} }
}, },
// 显示的主题,success|error|primary|info|warning // 显示的主题,success|error|primary|info|warning|none
// none主题默认为透明背景,黑色(contentColor)字体
type: { type: {
type: String, type: String,
default: 'warning' default: 'warning'
...@@ -90,10 +94,15 @@ export default { ...@@ -90,10 +94,15 @@ export default {
type: [Number, String], type: [Number, String],
default: 160 default: 160
}, },
// 播放状态,paly-播放,paused-暂停 // 播放状态,play-播放,paused-暂停
playState: { playState: {
type: String, type: String,
default: 'play' default: 'play'
},
// 通知的边距
padding: {
type: [Number, String],
default: '18rpx 24rpx'
} }
}, },
data() { data() {
...@@ -127,12 +136,14 @@ export default { ...@@ -127,12 +136,14 @@ export default {
// 计算字体颜色,如果没有自定义的,就用uview主题颜色 // 计算字体颜色,如果没有自定义的,就用uview主题颜色
computeColor() { computeColor() {
if (this.color) return this.color; if (this.color) return this.color;
else if(this.type == 'none') return this.$u.color['contentColor'];
else return this.$u.color[this.type]; else return this.$u.color[this.type];
}, },
// 计算背景颜色 // 计算背景颜色
computeBgColor() { computeBgColor() {
if (this.bgColor) return this.bgColor; if (this.bgColor) return this.bgColor;
return this.$u.color[this.type + 'Light']; else if(this.type == 'none') return 'transparent';
else return this.$u.color[this.type + 'Light'];
} }
}, },
mounted() { mounted() {
......
...@@ -9,9 +9,9 @@ ...@@ -9,9 +9,9 @@
</view> </view>
<view class="u-right-info" v-if="right" :style="{ <view class="u-right-info" v-if="right" :style="{
color: subColor color: subColor
}"> }" @tap="rightClick">
{{subTitle}} {{subTitle}}
<view class="u-icon-arrow" @tap="rightClick"> <view class="u-icon-arrow">
<u-icon name="arrow-right" size="22" :color="subColor"></u-icon> <u-icon name="arrow-right" size="22" :color="subColor"></u-icon>
</view> </view>
</view> </view>
......
// 引入全局mixin // 引入全局mixin
import mixin from '@/uview/libs/mixin/mixin.js' import mixin from '@/uview/libs/mixin/mixin.js'
import wxshare from '@/uview/libs/mixin/wxshare.js' // 引入关于是否mixin集成小程序分享的配置
// 全局挂载引入http相关请求拦截插件 import wxshare from '@/uview/libs/mixin/mpShare.js'
import http from '@/uview/libs/request' // 全局挂载引入http相关请求拦截插件
import http from '@/uview/libs/request'
function wranning (str) {
// 开发环境进行信息输出,主要是一些报错信息 function wranning(str) {
// 这个环境的来由是在程序编写时候,点击hx编辑器运行调试代码的时候,详见: // 开发环境进行信息输出,主要是一些报错信息
// https://uniapp.dcloud.io/frame?id=%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e5%92%8c%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83 // 这个环境的来由是在程序编写时候,点击hx编辑器运行调试代码的时候,详见:
if (process.env.NODE_ENV === 'development') { // https://uniapp.dcloud.io/frame?id=%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e5%92%8c%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83
console.warn(str) if (process.env.NODE_ENV === 'development') {
} console.warn(str)
} }
}
// 尝试判断在根目录的/store中是否有$u.mixin.js,此文件uView默认为需要挂在到全局的vuex的state变量
// HX2.6.11版本,放到try中,控制台依然会警告,暂时不用此方式, // 尝试判断在根目录的/store中是否有$u.mixin.js,此文件uView默认为需要挂在到全局的vuex的state变量
// let vuexStore = {}; // HX2.6.11版本,放到try中,控制台依然会警告,暂时不用此方式,
// try { // let vuexStore = {};
// vuexStore = require("@/store/$u.mixin.js"); // try {
// } catch (e) { // vuexStore = require("@/store/$u.mixin.js");
// //TODO handle the exception // } catch (e) {
// } // //TODO handle the exception
// }
// post类型对象参数转为get类型url参数
import { queryParams } from '@/uview/libs/function/queryParams.js' // post类型对象参数转为get类型url参数
// 路由封装 import {
import { route } from '@/uview/libs/function/route.js' queryParams
// 时间格式化 } from '@/uview/libs/function/queryParams.js'
import { timeFormat } from '@/uview/libs/function/timeFormat.js' // 路由封装
// 时间戳格式化,返回多久之前 import {
import { timeFrom } from '@/uview/libs/function/timeFrom.js' route
// 颜色渐变相关,colorGradient-颜色渐变,hexToRgb-十六进制颜色转rgb颜色,rgbToHex-rgb转十六进制 } from '@/uview/libs/function/route.js'
import { // 时间格式化
colorGradient, import {
hexToRgb, timeFormat
rgbToHex } from '@/uview/libs/function/timeFormat.js'
} from '@/uview/libs/function/colorGradient.js' // 时间戳格式化,返回多久之前
// 生成全局唯一guid字符串 import {
import { guid } from '@/uview/libs/function/guid.js' timeFrom
// 主题相关颜色,info|success|warning|primary|default|error,此颜色已在uview.scss中定义,但是为js中也能使用,故也定义一份 } from '@/uview/libs/function/timeFrom.js'
import { color } from '@/uview/libs/function/color.js' // 颜色渐变相关,colorGradient-颜色渐变,hexToRgb-十六进制颜色转rgb颜色,rgbToHex-rgb转十六进制
// 根据type获取图标名称 import {
import { type2icon } from '@/uview/libs/function/type2icon.js' colorGradient,
// 打乱数组的顺序 hexToRgb,
import { randomArray } from '@/uview/libs/function/randomArray.js' rgbToHex
} from '@/uview/libs/function/colorGradient.js'
// 规则检验 // 生成全局唯一guid字符串
import test from '@/uview/libs/function/test.js' import {
// 随机数 guid
import { random } from '@/uview/libs/function/random.js' } from '@/uview/libs/function/guid.js'
// 去除空格 // 主题相关颜色,info|success|warning|primary|default|error,此颜色已在uview.scss中定义,但是为js中也能使用,故也定义一份
import { trim } from '@/uview/libs/function/trim.js' import {
// toast提示,对uni.showToast的封装 color
import { toast } from '@/uview/libs/function/toast.js' } from '@/uview/libs/function/color.js'
// 根据type获取图标名称
// 配置信息 import {
import config from '@/uview/libs/config/config.js' type2icon
// 各个需要fixed的地方的z-index配置文件 } from '@/uview/libs/function/type2icon.js'
import zIndex from '@/uview/libs/config/zIndex.js' // 打乱数组的顺序
import {
const $u = { randomArray
queryParams, } from '@/uview/libs/function/randomArray.js'
route,
timeFormat, // 规则检验
date: timeFormat, // 另名date import test from '@/uview/libs/function/test.js'
timeFrom, // 随机数
colorGradient, import {
guid, random
color, } from '@/uview/libs/function/random.js'
type2icon, // 去除空格
randomArray, import {
wranning, trim
get: http.get, } from '@/uview/libs/function/trim.js'
post: http.post, // toast提示,对uni.showToast的封装
hexToRgb, import {
rgbToHex, toast
test, } from '@/uview/libs/function/toast.js'
random,
trim, // 配置信息
type: ['primary', 'success', 'error', 'warning', 'info'], import config from '@/uview/libs/config/config.js'
http, // 各个需要fixed的地方的z-index配置文件
toast, import zIndex from '@/uview/libs/config/zIndex.js'
config, // uView配置信息相关,比如版本号
zIndex const $u = {
} queryParams,
route,
const install = Vue => { timeFormat,
Vue.mixin(mixin) date: timeFormat, // 另名date
console.log(Vue.prototype.openShare) timeFrom,
if (Vue.prototype.openShare) { colorGradient,
Vue.mixin(wxshare) guid,
} color,
// Vue.mixin(vuexStore); type2icon,
// 时间格式化,同时两个名称,date和timeFormat randomArray,
Vue.filter('timeFormat', (timestamp, format) => { wranning,
return timeFormat(timestamp, format) get: http.get,
}) post: http.post,
Vue.filter('date', (timestamp, format) => { hexToRgb,
return timeFormat(timestamp, format) rgbToHex,
}) test,
// 将多久以前的方法,注入到全局过滤器 random,
Vue.filter('timeFrom', (timestamp, format) => { trim,
return timeFrom(timestamp, format) type: ['primary', 'success', 'error', 'warning', 'info'],
}) http,
Vue.prototype.$u = $u toast,
} config, // uView配置信息相关,比如版本号
zIndex
export default { }
install
const install = Vue => {
Vue.mixin(mixin)
if (Vue.prototype.openShare) {
Vue.mixin(mpShare);
}
// Vue.mixin(vuexStore);
// 时间格式化,同时两个名称,date和timeFormat
Vue.filter('timeFormat', (timestamp, format) => {
return timeFormat(timestamp, format)
})
Vue.filter('date', (timestamp, format) => {
return timeFormat(timestamp, format)
})
// 将多久以前的方法,注入到全局过滤器
Vue.filter('timeFrom', (timestamp, format) => {
return timeFrom(timestamp, format)
})
Vue.prototype.$u = $u
}
export default {
install
} }
module.exports = { module.exports = {
data () { data() {
return {} return {}
}, },
methods: { onLoad() {
// 查询节点信息 // getRect挂载到$u上,因为这方法需要使用in(this),所以无法把它独立成一个单独的文件导出
$uGetRect (selector, all) { this.$u.getRect = this.$uGetRect
return new Promise(resolve => { },
uni methods: {
.createSelectorQuery() // 查询节点信息
.in(this) $uGetRect(selector, all) {
[all ? 'selectAll' : 'select'](selector) return new Promise(resolve => {
.boundingClientRect(rect => { uni.createSelectorQuery()
if (all && Array.isArray(rect) && rect.length) { .in(this)[all ? 'selectAll' : 'select'](selector)
resolve(rect) .boundingClientRect(rect => {
} if (all && Array.isArray(rect) && rect.length) {
if (!all && rect) { resolve(rect)
resolve(rect) }
} if (!all && rect) {
}) resolve(rect)
.exec() }
}) })
} .exec()
}, })
onReachBottom () { }
uni.$emit('uOnReachBottom') },
} onReachBottom() {
uni.$emit('uOnReachBottom')
}
} }
module.exports = {
onLoad() {
// 设置默认的转发参数
this.$u.mpShare = {
title: '', // 默认为小程序名称
path: '', // 默认为当前页面路径
imageUrl: '' // 默认为当前页面的截图
}
},
onShareAppMessage() {
return this.$u.mpShare
}
}
module.exports = {
onLoad () {
// getRect挂载到$u上,因为这方法需要使用in(this),所以无法把它独立成一个单独的文件导出
this.$u.getRect = this.$uGetRect
// 设置默认的转发参数
this.$u.mpShare = {
title: '', // 默认为小程序名称
path: '', // 默认为当前页面路径
imageUrl: '' // 默认为当前页面的截图
}
},
onShareAppMessage () {
return this.$u.mpShare
}
}
...@@ -107,7 +107,9 @@ class Request { ...@@ -107,7 +107,9 @@ class Request {
options.url : '/' + options.url)); options.url : '/' + options.url));
// 是否显示loading // 是否显示loading
if(this.config.showLoading) { // 加一个是否已有timer定时器的判断,否则有两个同时请求的时候,后者会清除前者的定时器id
// 而没有清除前者的定时器,导致前者超时,一直显示loading
if(this.config.showLoading && !this.config.timer) {
this.config.timer = setTimeout(() => { this.config.timer = setTimeout(() => {
uni.showLoading({ uni.showLoading({
title: this.config.loadingText, title: this.config.loadingText,
...@@ -115,7 +117,7 @@ class Request { ...@@ -115,7 +117,7 @@ class Request {
}) })
}, this.config.loadingTime); }, this.config.loadingTime);
} }
uni.request(options) uni.request(options);
}) })
} }
...@@ -141,5 +143,4 @@ class Request { ...@@ -141,5 +143,4 @@ class Request {
} }
} }
} }
export default new Request export default new Request
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment