2025-07-19 19:41:27 +08:00

255 lines
6.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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>