Radio.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. <template>
  2. <div v-if="item" class="radio-wrap bgques clearfix" :style="getStyle(detail,slide)">
  3. <!-- <p v-for="(it,index) in datas.questionDetailList" :key="it.id" class="list" @click="handleClick(it,index,true)"> -->
  4. <div v-for="(it,index) in datas.questionDetailList" :key="it.id" :class="['list',{'block':((it.description||it.name).indexOf('${'))!=-1}]">
  5. <!-- <img :src="it.select==1?check:defaultPic"> -->
  6. <span v-if="((it.description||it.name).indexOf('${'))==-1" :class="['radioCheck',{'check':it.select==1}]" @click="handleClick(it,index,true)">{{it.description||it.name}}</span>
  7. <OptionInp v-else :item="it" @handleInp="inpVal($event,index)" @handleSelec="handleClick(it,index,false,true)"/>
  8. </div>
  9. </div>
  10. </template>
  11. <script type="text/javascript">
  12. import icon from '../images/radio-default.png';
  13. import checkIcon from '../images/radio-check.png';
  14. import {patt,concatVal} from '@utils/tools.js';
  15. import MultiLineInput from '../common/MultiLineInput.vue';
  16. import OptionInp from '../common/OptionInp.vue';
  17. export default{
  18. name:'Radio',
  19. props:{
  20. item:{
  21. default:''
  22. },
  23. slide:{
  24. default:false,
  25. type:Boolean
  26. },
  27. detail:{
  28. default:2,
  29. type:Number||String
  30. }
  31. },
  32. data(){
  33. return{
  34. defaultPic:icon,
  35. check:checkIcon,
  36. datas:{}
  37. }
  38. },
  39. created(){
  40. // this.datas = JSON.parse(JSON.stringify(this.item));
  41. this.datas = this.item;
  42. },
  43. methods:{
  44. getStyle(detail,slide){
  45. if(detail == 1){
  46. if(slide){
  47. return {'display':'block','background-color': '#F9F9F9'}
  48. }else{
  49. return {'display':'none'}
  50. }
  51. }else{
  52. return {'display':'block'}
  53. }
  54. },
  55. handleClick(it,index,flg,ipt){
  56. if(flg){
  57. document.activeElement.blur();
  58. document.activeElement.scrollIntoViewIfNeeded(true);
  59. setTimeout(()=>{
  60. document.activeElement.scrollIntoViewIfNeeded(true);
  61. },300)
  62. }
  63. const list = this.datas;
  64. let data = list.questionDetailList&&list.questionDetailList.slice(0); //数组深拷贝
  65. if(ipt){//输入框单选,输入了内容才算选中,删除内容算取消
  66. for(let i=0;i<data.length; i++){
  67. if(i==index){
  68. data[i].select=data[i].value?1:0;
  69. }else{
  70. data[i].select = 0
  71. }
  72. }
  73. }else{
  74. for(let i=0;i<data.length; i++){
  75. if(i==index){
  76. data[i].select = data[i].select==1?0:1;
  77. }else{
  78. data[i].select = 0
  79. }
  80. }
  81. }
  82. let temp = concatVal(data);
  83. const newData = Object.assign({},this.datas,{questionDetailList:data,value:temp.value,valueP:temp.valueP})
  84. this.$emit("updata",newData);
  85. },
  86. inpVal(val,index){//输入框失焦处理
  87. // 输入框回读
  88. let detailList = this.datas.questionDetailList;
  89. let currItem = detailList[index];
  90. currItem.value = val;
  91. // 输入框失焦重新拼接父级的value
  92. let temp = concatVal(detailList);
  93. this.datas.value = temp.value;
  94. this.datas.valueP = temp.valueP;
  95. this.$emit("updata",this.datas);
  96. },
  97. },
  98. watch:{
  99. item:{
  100. handler(newVal,oldVal){
  101. this.datas = JSON.parse(JSON.stringify(newVal));
  102. },
  103. deep:true
  104. }
  105. },
  106. components:{
  107. MultiLineInput,
  108. OptionInp
  109. }
  110. }
  111. </script>
  112. <style lang="less" scoped>
  113. @import '../less/base.less';
  114. .radio-wrap{
  115. .bgques;
  116. img{
  117. width:100%;
  118. }
  119. .block{
  120. width:100%;
  121. }
  122. .list{
  123. color: #colors[text];
  124. margin:0 .05rem;
  125. padding: .05rem;
  126. display: inline-block;
  127. white-space: nowrap;
  128. // overflow-x: hidden;
  129. float: left;
  130. // -webkit-white-space: nowrap;
  131. // -webkit-box-orient: vertical;
  132. img{
  133. width: .38rem;
  134. vertical-align: middle;
  135. }
  136. >span{
  137. white-space: normal;
  138. vertical-align: middle;
  139. }
  140. .radioCheck {
  141. display: inline-block;
  142. line-height: .66rem;
  143. // min-width: 2rem;
  144. // text-align: center;
  145. padding:0 .2rem;
  146. box-sizing: border-box;
  147. border-radius: .38rem;
  148. border: 1px solid #dfe0e4;
  149. background-color: #ffffff;
  150. }
  151. .check{
  152. color: #fff;
  153. background-color: #6678FF;
  154. border: 1px solid #6678FF;
  155. }
  156. .iptCheck {
  157. color: #colors[theme];
  158. }
  159. }
  160. }
  161. </style>