zoukankan      html  css  js  c++  java
  • iView tag 多个标签只能选择一个(测试)

    现有的iView官网的标签没有监听是否选中的属性,所有需要新加组件

    首先到iView的官方地址找到Tag的源码,拷贝过来进行修改

    源码地址:https://github.com/iview/iview   在组件目录下找到Tag的,拷贝相关的导入文件到现有的项目中

    1、在当前项目的组件目录创建tagg目录,拷贝源码的utils目录下的assist.js文件到tagg文件中

    然后拷贝源码icon目录中的文件到当前项目的componets文件中

    2、拷贝tag标签的源码,并进行修改

      1 <template>
      2     <transition name="fade" v-if="fade">
      3         <div :class="classes" @click.stop="check" :style="wraperStyles">
      4             <span :class="dotClasses" v-if="showDot" :style="bgColorStyle"></span>
      5             <span :class="textClasses" :style="textColorStyle"><slot></slot></span>
      6             <Icon v-if="closable" :class="iconClass" :color="lineColor" type="ios-close" @click.native.stop="close"></Icon>
      7         </div>
      8     </transition>
      9     <div v-else :class="classes" @click.stop="check" :style="wraperStyles">
     10         <span :class="dotClasses" v-if="showDot" :style="bgColorStyle"></span>
     11         <span :class="textClasses" :style="textColorStyle"><slot></slot></span>
     12         <Icon v-if="closable" :class="iconClass" :color="lineColor" type="ios-close" @click.native.stop="close"></Icon>
     13     </div>
     14 </template>
     15 <script>
     16     import Icon from '../icon';
     17     import { oneOf } from './assist';
     18     const prefixCls = 'ivu-tag';
     19     const initColorList = ['default', 'primary', 'success', 'warning', 'error', 'blue', 'green', 'red', 'yellow', 'pink', 'magenta', 'volcano', 'orange', 'gold', 'lime', 'cyan', 'geekblue', 'purple'];
     20     const colorList = ['pink', 'magenta', 'volcano', 'orange', 'gold', 'lime', 'cyan', 'geekblue', 'purple'];
     21 
     22     export default {
     23         name: 'Tagg',
     24         components: { Icon },
     25         props: {
     26             closable: {
     27                 type: Boolean,
     28                 default: false
     29             },
     30             checkable: {
     31                 type: Boolean,
     32                 default: false
     33             },
     34             checked: {
     35                 type: Boolean,
     36                 default: true
     37             },
     38             color: {
     39                 type: String,
     40                 default: 'default'
     41             },
     42             type: {
     43                 validator (value) {
     44                     return oneOf(value, ['border', 'dot']);
     45                 }
     46             },
     47             name: {
     48                 type: [String, Number]
     49             },
     50             fade: {
     51                 type: Boolean,
     52                 default: true
     53             }
     54         },
     55         data () {
     56             return {
     57                 isChecked: this.checked
     58             };
     59         },
     60         watch:{
     61             checked:{
     62                 handler:function(newValue,old){
     63                     console.log(this.name);
     64                     console.log(newValue);
     65                     this.checked = newValue;
     66                     this.isChecked = this.checked;
     67                 },
     68                 deep:true
     69             }
     70         },
     71         computed: {
     72             classes () {
     73                 return [
     74                     `${prefixCls}`,
     75                     {
     76                         [`${prefixCls}-${this.color}`]: !!this.color && oneOf(this.color, initColorList),
     77                         [`${prefixCls}-${this.type}`]: !!this.type,
     78                         [`${prefixCls}-closable`]: this.closable,
     79                         [`${prefixCls}-checked`]: this.isChecked
     80                     }
     81                 ];
     82             },
     83             wraperStyles () {
     84                 return oneOf(this.color, initColorList) ? {} : {background: this.isChecked ? this.defaultTypeColor : 'transparent', borderWidth: '1px', borderStyle: 'solid', borderColor: ((this.type !== 'dot' && this.type !== 'border' && this.isChecked) ? this.borderColor : this.lineColor), color: this.lineColor};
     85             },
     86             textClasses () {
     87                 return [
     88                     `${prefixCls}-text`,
     89                     this.type === 'border' ? (oneOf(this.color, initColorList) ? `${prefixCls}-color-${this.color}` : '') : '',
     90                     (this.type !== 'dot' && this.type !== 'border' && this.color !== 'default') ? (this.isChecked && colorList.indexOf(this.color) < 0 ? `${prefixCls}-color-white` : '') : ''
     91                 ];
     92             },
     93             dotClasses () {
     94                 return `${prefixCls}-dot-inner`;
     95             },
     96             iconClass () {
     97                 if (this.type === 'dot') {
     98                     return '';
     99                 } else if (this.type === 'border') {
    100                     return oneOf(this.color, initColorList) ? `${prefixCls}-color-${this.color}` : '';
    101                 } else {
    102                     return this.color !== undefined ? (this.color === 'default' ? '' : 'rgb(255, 255, 255)') : '';
    103                 }
    104             },
    105             showDot () {
    106                 return !!this.type && this.type === 'dot';
    107             },
    108             lineColor () {
    109                 if (this.type === 'dot') {
    110                     return '';
    111                 } else if (this.type === 'border') {
    112                     return this.color !== undefined ? (oneOf(this.color, initColorList) ? '' : this.color) : '';
    113                 } else {
    114                     return this.color !== undefined ? (this.color === 'default' ? '' : 'rgb(255, 255, 255)') : '';
    115                 }
    116             },
    117             borderColor () {
    118                 return this.color !== undefined ? (this.color === 'default' ? '' : this.color) : '';
    119             },
    120             dotColor () {
    121                 return this.color !== undefined ? (oneOf(this.color, initColorList) ? '' : this.color) : '';
    122             },
    123             textColorStyle () {
    124                 return oneOf(this.color, initColorList) ? {} : ((this.type !== 'dot' && this.type !== 'border') ? (this.isChecked ? {color: this.lineColor} : {}) : {color: this.lineColor});
    125             },
    126             bgColorStyle () {
    127                 return oneOf(this.color, initColorList) ? {} : {background: this.dotColor};
    128             },
    129             defaultTypeColor () {
    130                 return (this.type !== 'dot' && this.type !== 'border') ? (this.color !== undefined ? (oneOf(this.color, initColorList) ? '' : this.color) : '') : '';
    131             }
    132         },
    133         methods: {
    134             close (event) {
    135                 if (this.name === undefined) {
    136                     this.$emit('on-close', event);
    137                 } else {
    138                     this.$emit('on-close', event, this.name);
    139                 }
    140             },
    141             check () {
    142                 if (!this.checkable) return;
    143                 const checked = !this.isChecked;
    144                 this.isChecked = checked;
    145                 if (this.name === undefined) {
    146                     this.$emit('on-change', checked);
    147                 } else {
    148                     this.$emit('on-change', checked, this.name);
    149                 }
    150             },
    151             test(param){
    152                 console.log(param);
    153             }
    154         }
    155     };
    156 </script>
    View Code

    添加了对父类组件的传递的数据的监听   watch中的deep应该可以不用加

    3、测试代码

      1 <template>
      2     <Card>
      3         <Tagg v-for="item in onelist" :name="item.value"
      4         :key="item.value" @on-change="tagchange" :checked="item.checked" :checkable="item.checkable" color="success">{{item.key}}{{item.checked}}</Tagg>
      5         <ol>
      6             <li v-for="item in twolist" :key="item.value" style="list-style-type:none">
      7                 <Row>
      8                     <Col span="2">
      9                         <Tag :name="item.value" :key="item.value" :checked="item.checked" :checkable="item.checkable"
     10                          :color="item.color">{{item.key}}
     11                          </Tag>
     12                     </Col>
     13                     <Col span="22" pull="1">
     14                         <Tag v-for="inner in item.child" :name="inner.value" 
     15         :key="inner.value" :checked="inner.checked" :checkable="inner.checkable" color="success">{{inner.key}}</Tag>
     16                     </Col>
     17                 </Row>
     18             </li>
     19         </ol>
     20     </Card>
     21 </template>
     22 <script>
     23 import Tagg from "_c/tagg/tagg.vue";
     24 export default {
     25     data(){
     26         return {
     27             onelist:[
     28                 {
     29                 key:'电影',
     30                 value:'1',
     31                 checked:false,
     32                 checkable:true,
     33                 pid:0,
     34                 color:'success'
     35                 },
     36                 {
     37                 key:'电视剧',
     38                 value:'2',
     39                 checked:false,
     40                 checkable:true,
     41                 pid:0,
     42                 color:'success'
     43                 },
     44                 {
     45                 key:'综艺',
     46                 value:'3',
     47                 checked:false,
     48                 checkable:true,
     49                 pid:0,
     50                 color:'success'
     51                 },
     52                  {
     53                 key:'动漫',
     54                 value:'4',
     55                 checked:false,
     56                 checkable:true,
     57                 pid:0,
     58                 color:'success'
     59                 }
     60             ],
     61             twolist:[
     62                 {
     63                 key:'地区',
     64                 value:'5',
     65                 checked:false,
     66                 checkable:false,
     67                 pid:1,
     68                 child:[
     69                     {
     70                         key:'中国',
     71                         value:'8',
     72                         checked:false,
     73                         checkable:true,
     74                         pid:5,   
     75                     },
     76                     {
     77                         key:'韩国',
     78                         value:'9',
     79                         checked:false,
     80                         checkable:true,
     81                         pid:5,   
     82                     },
     83                     {
     84                         key:'北美',
     85                         value:'10',
     86                         checked:false,
     87                         checkable:true,
     88                         pid:5,   
     89                     }
     90                 ]
     91                 },
     92                 {
     93                 key:'年代',
     94                 value:'6',
     95                 checked:false,
     96                 checkable:false,
     97                 pid:1,
     98                 child:[
     99                     {
    100                         key:'1990',
    101                         value:'11',
    102                         checked:false,
    103                         checkable:true,
    104                         pid:6,   
    105                     },
    106                     {
    107                         key:'1991',
    108                         value:'12',
    109                         checked:false,
    110                         checkable:true,
    111                         pid:6,   
    112                     }
    113 
    114                 ]
    115                 },
    116                   {
    117                 key:'国家',
    118                 value:'7',
    119                 checked:false,
    120                 checkable:false,
    121                 pid:1,
    122                 child:[
    123                    {
    124                         key:'1991',
    125                         value:'13',
    126                         checked:false,
    127                         checkable:true,
    128                         pid:7,   
    129                     } 
    130                 ]
    131                 }
    132             ],
    133             threelist:[
    134                 {
    135                 key:'地区1',
    136                 value:'5',
    137                 checked:false,
    138                 checkable:false,
    139                 pid:1,
    140                 child:[
    141                     {
    142                         key:'中国',
    143                         value:'8',
    144                         checked:false,
    145                         checkable:true,
    146                         pid:5,   
    147                     },
    148                     {
    149                         key:'韩国',
    150                         value:'9',
    151                         checked:false,
    152                         checkable:true,
    153                         pid:5,   
    154                     },
    155                     {
    156                         key:'北美',
    157                         value:'10',
    158                         checked:false,
    159                         checkable:true,
    160                         pid:5,   
    161                     }
    162                 ]
    163                 },
    164                 {
    165                 key:'年代1',
    166                 value:'6',
    167                 checked:false,
    168                 checkable:false,
    169                 pid:1,
    170                 child:[
    171                     {
    172                         key:'1990',
    173                         value:'11',
    174                         checked:false,
    175                         checkable:true,
    176                         pid:6,   
    177                     },
    178                     {
    179                         key:'1991',
    180                         value:'12',
    181                         checked:false,
    182                         checkable:true,
    183                         pid:6,   
    184                     }
    185 
    186                 ]
    187                 },
    188                   {
    189                 key:'国家1',
    190                 value:'7',
    191                 checked:false,
    192                 checkable:false,
    193                 pid:1,
    194                 child:[
    195                    {
    196                         key:'1991',
    197                         value:'13',
    198                         checked:false,
    199                         checkable:true,
    200                         pid:7,   
    201                     } 
    202                 ]
    203                 }
    204             ],
    205         }
    206     },
    207     created(){
    208 
    209     },
    210     components:{
    211         Tagg
    212     },
    213     mounted(){
    214 
    215     },
    216     methods:{
    217        tagchange(checked,name){
    218             for(var i=0;i<this.onelist.length;i++){
    219                 var item = this.onelist[i];
    220                 if(item.value == name){
    221                     item.checked = true;
    222                     this.$set(this.onelist,i,item);
    223                 }else if(item.value != name && item.checked){
    224                     item.checked = false;
    225                     this.$set(this.onelist,i,item);
    226                 }
    227             }
    228         }
    229     }
    230 }
    231 </script>
    View Code
  • 相关阅读:
    [hdu1402]A * B Problem Plus(NTT)
    拦截导弹问题(Noip1999)
    删数问题(Noip1994)
    1217:棋盘问题
    随笔功能测试
    教师派8
    教师派7
    教师派6
    教师派5
    教室派4
  • 原文地址:https://www.cnblogs.com/nihaofenghao/p/10055273.html
Copyright © 2011-2022 走看看