思路简述
需求:桌子上有一排灯,点哪个亮哪个,但是要求每次只能点亮一盏。 如果不使用排他思想,操作过程如下:
第一次打开一盏灯,记为 A,记录下来。 第二次打开灯之前,先去找记录,得知刚才打开的是 A,关掉 A。 第二次打开一盏灯,记为 B,记录下来。 第三次打开灯之前,先去找记录,得知刚才打开的是 B,关掉 B。 … 上述方法需要频繁操作存储,并且产生了很多变量。 使用排他思想的话,操作过程如下:
第一次打开一盏灯。 第二次打开灯之前,不管之前打开的是谁,让所有的灯都执行关闭操作。 第二次打开一盏灯。 第三次打开灯之前,不管之前打开的是谁,让所有的灯都执行关闭操作。 … 上述方法未产生新变量,也没有操作存储。
实例应用
< template>
< div>
< div class = " redioBlock" >
< div
class = " sinRadio"
v-for = " (item, index) in redioArr"
:key = " index"
@click = " chooseOnlyOne(index)"
>
< div class = " value" :class = " item.value ? 'choosed' : ''" > </ div>
< div class = " label" :class = " item.value ? 'choosed' : ''" >
{{ item.label }}
</ div>
</ div>
</ div>
</ div>
</ template>
< script>
export default {
data ( ) {
return {
redioArr : [
{ value : false , label : "第一个值" } ,
{ value : false , label : "第二个值" } ,
{ value : false , label : "第三个值" } ,
{ value : false , label : "第四个值" } ,
] ,
} ;
} ,
watch : { } ,
mounted ( ) { } ,
methods : {
chooseOnlyOne ( chooseIndex ) {
this . redioArr. forEach ( ( item, index ) => {
item. value = false ;
if ( index == chooseIndex) {
item. value = true ;
}
} ) ;
} ,
} ,
} ;
</ script>
< style lang = " less" scoped >
.sinRadio {
overflow : hidden;
line-height : 40px;
.value {
width : 20px;
height : 20px;
float : left;
border : 1px solid #ccc;
border-radius : 50%;
margin-right : 10px;
margin-top : 10px;
&.choosed {
background : #87add8;
border : 1px solid #87add8;
}
}
.label {
float : left;
&.choosed {
font-weight : bold;
}
}
}
</ style>
低配版 radio 组合(利用了 vue 的特性,另一种实现方式,与本文思想无关)
< template>
< div>
< div class = " redioBlock" >
< div
class = " sinRadio"
v-for = " (item, index) in redioArr"
:key = " index"
@click = " chooseOnlyOne(index)"
>
< div
class = " value"
:class = " index == activeIndex ? 'choosed' : ''"
> </ div>
< div
class = " label"
:class = " index == activeIndex ? 'choosed' : ''"
>
{{ item.label }}
</ div>
</ div>
</ div>
</ div>
</ template>
< script>
export default {
data ( ) {
return {
activeIndex : null ,
redioArr : [
{ label : "第一个值" } ,
{ label : "第二个值" } ,
{ label : "第三个值" } ,
{ label : "第四个值" } ,
] ,
} ;
} ,
watch : { } ,
mounted ( ) { } ,
methods : {
chooseOnlyOne ( chooseIndex ) {
this . activeIndex = chooseIndex;
} ,
} ,
} ;
</ script>
关键信息脱敏(点击星号,只展示当前脱敏信息,其他内容仍是脱敏状态)
< template>
< div>
< div class = " tableBlock" >
< el-table
class = " myTable"
:data = " tableData"
style = " width : 100%"
:key = " num"
>
< el-table-column prop = " name" label = " 姓名" width = " 200" >
</ el-table-column>
< el-table-column prop = " phone" label = " 电话" width = " 200" >
< template slot-scope = " scope" >
< div @click = " chooseOnlyOne(scope.$index, 'phone')" >
{{ scope.row.phoneHidden }}
</ div>
</ template>
</ el-table-column>
< el-table-column prop = " idCard" label = " 证件号" >
< template slot-scope = " scope" >
< div @click = " chooseOnlyOne(scope.$index, 'idCard')" >
{{ scope.row.idCardHidden }}
</ div>
</ template>
</ el-table-column>
</ el-table>
</ div>
</ div>
</ template>
< script>
export default {
data ( ) {
return {
activeIndex : null ,
tableData : [
{
name : "张三" ,
phone : "15222222222" ,
idCard : "100000000000000000" ,
} ,
{
name : "李四" ,
phone : "15222222222" ,
idCard : "100000000000000000" ,
} ,
{
name : "王五" ,
phone : "15222222222" ,
idCard : "100000000000000000" ,
} ,
{
name : "赵六" ,
phone : "15222222222" ,
idCard : "100000000000000000" ,
} ,
] ,
num : 0 ,
} ;
} ,
watch : { } ,
mounted ( ) {
this . tableData. forEach ( ( item, index ) => {
item. phoneHidden = "***" ;
item. idCardHidden = "******" ;
} ) ;
} ,
methods : {
chooseOnlyOne ( chooseIndex, type ) {
this . tableData. forEach ( ( item, index ) => {
item. phoneHidden = "***" ;
item. idCardHidden = "******" ;
} ) ;
this . tableData. forEach ( ( item, index ) => {
if ( index == chooseIndex) {
if ( type == "phone" ) {
item. phoneHidden = item. phone;
} else {
item. idCardHidden = item. idCard;
}
}
} ) ;
this . num += 1 ;
} ,
} ,
} ;
</ script>