255 lines
6.2 KiB
Vue
255 lines
6.2 KiB
Vue
|
|
<template>
|
||
|
|
<view :id="id">
|
||
|
|
<slot></slot>
|
||
|
|
</view>
|
||
|
|
</template>
|
||
|
|
|
||
|
|
<script>
|
||
|
|
import {
|
||
|
|
mapMutations,
|
||
|
|
mapActions,
|
||
|
|
mapState
|
||
|
|
} from 'vuex';
|
||
|
|
export default {
|
||
|
|
name: "unitvPage",
|
||
|
|
inject: ['pageId','pageState'],
|
||
|
|
props: {
|
||
|
|
id: {// Zone Id
|
||
|
|
type: String,
|
||
|
|
required: true
|
||
|
|
},
|
||
|
|
up: {// Zone切换时上一Zone Id
|
||
|
|
type: String
|
||
|
|
},
|
||
|
|
down: {// Zone切换时下一Zone Id
|
||
|
|
type: String
|
||
|
|
},
|
||
|
|
left: {// Zone切换时左一Zone Id
|
||
|
|
type: String
|
||
|
|
},
|
||
|
|
right: {// Zone切换时右一Zone Id
|
||
|
|
type: String
|
||
|
|
},
|
||
|
|
item: {// Zone当前焦点item索引
|
||
|
|
type: Number,
|
||
|
|
default: 0
|
||
|
|
},
|
||
|
|
prevZone: {// Zone改变后的上一个Zone Id
|
||
|
|
type: String
|
||
|
|
},
|
||
|
|
row: {// Zone的item总行数
|
||
|
|
type: Number,
|
||
|
|
default: 1
|
||
|
|
},
|
||
|
|
column: {// Zone的item总列数
|
||
|
|
type: Number,
|
||
|
|
default: 1
|
||
|
|
},
|
||
|
|
defaultBehavior:{
|
||
|
|
type: Boolean,
|
||
|
|
default:true
|
||
|
|
},
|
||
|
|
autoFous:{
|
||
|
|
type: Boolean,
|
||
|
|
default:false
|
||
|
|
},
|
||
|
|
values:{
|
||
|
|
type: Array,
|
||
|
|
default: () => []
|
||
|
|
},
|
||
|
|
count:{
|
||
|
|
type: Number,
|
||
|
|
default:0
|
||
|
|
}
|
||
|
|
},
|
||
|
|
provide() {
|
||
|
|
return {
|
||
|
|
zoneId: this.id,
|
||
|
|
zoneState:this.zoneState,
|
||
|
|
zoneItems:this.items
|
||
|
|
}
|
||
|
|
},
|
||
|
|
created() {
|
||
|
|
//console.log(this.pageId)
|
||
|
|
if(this.autoFous){
|
||
|
|
this.pageState.curZoneId=this.id;
|
||
|
|
this.zoneState.curZone=true;
|
||
|
|
this.focus=true;
|
||
|
|
this.switchZone(this);
|
||
|
|
}
|
||
|
|
this._switchItem(this.item);
|
||
|
|
this.currentPage.pushZone(this);
|
||
|
|
},
|
||
|
|
mounted(){
|
||
|
|
|
||
|
|
},
|
||
|
|
computed: {
|
||
|
|
...mapState(['currentZone','currentPage']),
|
||
|
|
size:function(){
|
||
|
|
if(this.count!=0){
|
||
|
|
return this.count;
|
||
|
|
}else if(this.values.length!=0){
|
||
|
|
return this.values.length;
|
||
|
|
}else {
|
||
|
|
return this.items.length;
|
||
|
|
}
|
||
|
|
},
|
||
|
|
rows:function(){
|
||
|
|
if(this.row>1){
|
||
|
|
return this.row;
|
||
|
|
}
|
||
|
|
return Math.ceil(this.size/this.column)
|
||
|
|
}
|
||
|
|
},
|
||
|
|
data() {
|
||
|
|
return {
|
||
|
|
citem:0,
|
||
|
|
crow:0,// Zone的当前行
|
||
|
|
prevItem:0,// item改变后的上一item索引
|
||
|
|
focus:false,
|
||
|
|
items:[],// Zone的所有item数组集合
|
||
|
|
zoneState:{
|
||
|
|
curItem:this.citem,
|
||
|
|
curZone:this.focus,
|
||
|
|
curScroll:null
|
||
|
|
},
|
||
|
|
StepSeq:0
|
||
|
|
}},
|
||
|
|
methods: {
|
||
|
|
...mapMutations(['switchZone']),
|
||
|
|
_switchItem:function(item,oldItem){
|
||
|
|
this.citem=item;
|
||
|
|
this.zoneState.curItem=item;
|
||
|
|
try{
|
||
|
|
this.refreshItem();
|
||
|
|
if(oldItem!=undefined){
|
||
|
|
this.items[oldItem].refreshState();
|
||
|
|
}
|
||
|
|
}catch(e){}
|
||
|
|
},
|
||
|
|
refreshItem:function(){
|
||
|
|
this.items[this.citem].refreshState();
|
||
|
|
},
|
||
|
|
evtArrow:function(Arrow){
|
||
|
|
var self=this;
|
||
|
|
//this._switchItem(this.citem+1);
|
||
|
|
var oldItem=this.citem || 0;
|
||
|
|
var item = this.citem || 0;
|
||
|
|
var steps = this.rows * this.column;
|
||
|
|
var Row = Math.floor(item/this.column);
|
||
|
|
var Border = this[Arrow];
|
||
|
|
var cRow = this.crow;
|
||
|
|
switch(Arrow){
|
||
|
|
case 'left':
|
||
|
|
item -= 1;
|
||
|
|
if (Math.floor(item / this.column) != Row) {
|
||
|
|
item = item - steps;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 'right':
|
||
|
|
item += 1;
|
||
|
|
if (Math.floor(item / this.column) != Row) {
|
||
|
|
item = item + steps;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 'up':
|
||
|
|
item -= this.column;
|
||
|
|
this.crow = cRow - 1;
|
||
|
|
break;
|
||
|
|
case 'down':
|
||
|
|
item += this.column;
|
||
|
|
this.crow = cRow + 1;
|
||
|
|
break;
|
||
|
|
};
|
||
|
|
|
||
|
|
if(item >=0 && item <= steps-1){
|
||
|
|
if (item+this.StepSeq*steps+1 > this.size) {
|
||
|
|
item = this.size-this.StepSeq*steps-1;
|
||
|
|
}
|
||
|
|
this.citem = item;
|
||
|
|
// keyController.defaultChangeItem(CurrentPage,CurrentZone,CurrentPage,CurrentZone);
|
||
|
|
this._switchItem(this.citem,oldItem);
|
||
|
|
if(this.crow===(this.rows-1)){
|
||
|
|
this.$emit("scrolltolower");
|
||
|
|
}
|
||
|
|
} else{
|
||
|
|
this.crow = cRow;
|
||
|
|
OverBorder();
|
||
|
|
};
|
||
|
|
function OverBorder(){
|
||
|
|
if(Border){
|
||
|
|
if(Border === self.id){
|
||
|
|
ScrollItem();
|
||
|
|
}else{
|
||
|
|
ChangeZone();
|
||
|
|
}
|
||
|
|
} ;
|
||
|
|
function ScrollItem(){
|
||
|
|
switch (Arrow){
|
||
|
|
case 'up':
|
||
|
|
item = self.citem + self.column*(self.rows-1);
|
||
|
|
self.crow = self.rows-1;
|
||
|
|
break
|
||
|
|
case 'down':
|
||
|
|
item = self.citem - self.column*(self.rows-1);
|
||
|
|
self.crow = 0;
|
||
|
|
break
|
||
|
|
case 'left':
|
||
|
|
item = (Row+1)*self.column - 1;
|
||
|
|
break
|
||
|
|
case 'right':
|
||
|
|
item = Row*self.column;
|
||
|
|
break
|
||
|
|
};
|
||
|
|
//当前焦点区域对应的数值的个数超过一屏的显示个数,产生翻页效果
|
||
|
|
if (self.size > steps) {
|
||
|
|
self.StepSeq = self.StepSeq || 0;
|
||
|
|
var MaxSeq = Math.ceil(self.size/steps)-1;
|
||
|
|
if ((Arrow === 'left') || (Arrow === 'up')){
|
||
|
|
//左键或者上键,往前翻
|
||
|
|
self.StepSeq = (self.StepSeq>0)?self.StepSeq-1:MaxSeq;
|
||
|
|
} else if ((Arrow === 'right') || (Arrow === 'down')) {
|
||
|
|
//右键或者下键,往后翻
|
||
|
|
self.StepSeq = (self.StepSeq<MaxSeq)?self.StepSeq+1:0;
|
||
|
|
};
|
||
|
|
};
|
||
|
|
//数值个数不够时,光标定位在第一个上面
|
||
|
|
if (item+self.StepSeq*steps+1 > self.size) {
|
||
|
|
item = 0;
|
||
|
|
}
|
||
|
|
self.citem = item;
|
||
|
|
//执行用户定义函数
|
||
|
|
self._switchItem(self.citem,oldItem);
|
||
|
|
};
|
||
|
|
function ChangeZone(){
|
||
|
|
self.currentPage.ChangeZone(Border);
|
||
|
|
self.refreshItem();
|
||
|
|
};
|
||
|
|
|
||
|
|
};
|
||
|
|
|
||
|
|
},
|
||
|
|
evtEnter:function(){
|
||
|
|
var itemObj=this.items[this.citem];
|
||
|
|
if(itemObj){
|
||
|
|
itemObj.handleClick();
|
||
|
|
}
|
||
|
|
},
|
||
|
|
evtDel:function(){
|
||
|
|
var itemObj=this.items[this.citem];
|
||
|
|
if(itemObj){
|
||
|
|
itemObj.handleDel();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
watch: {
|
||
|
|
values:function(newVal,oldVal){
|
||
|
|
//console.log(newVal);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
</script>
|
||
|
|
|
||
|
|
<style scoped>
|
||
|
|
</style>
|