tags: ‘vue’

categories: ‘vue’

vue循环时动态设置ref,获取ref报错

注意:ref不需要唯一

错误使用

设置ref

  1. <li v-for="(item, index) in arr">
  2. <p>
  3. <input :ref="name + index" type="file" @change="uploadImgSave($event, index)" style="display: none;">
  4. <button @click="uploadImg(index)">点击上传图片</button>
  5. </p>
  6. <img :src="item" alt="" width="150" height="150">
  7. </li>

获取ref — 这个是有问题的
获取不到ref元素,调试发现,获取到的是undefined

  1. uploadImg(i){
  2. this.$refs[name + i].click(); // 报错
  3. }

正确使用

没必要给循环列表的每一个元素加上不一样的ref,而只用给他们都加上一样的ref,根据此ref获取到的是一个数组列表,然后根据index即可定位该元素

设置ref

  1. <input :ref="name" type="file" @change="uploadImgSave($event, index)" style="display: none;">

获取ref

  1. uploadImg(i){
  2. this.$refs[name][i].click();
  3. }

解决完整例子:

  1. <template>
  2. <div class="main">
  3. <ul>
  4. <li v-for="(item, index) in arr">
  5. <p>
  6. <input :ref="name" type="file" @change="uploadImgSave($event, index)" style="display: none;">
  7. <button @click="uploadImg(index)">点击上传图片</button>
  8. </p>
  9. <img :src="item" alt="" width="150" height="150">
  10. </li>
  11. </ul>
  12. </div>
  13. </template>
  14. <script>
  15. let _this = '';
  16. export default{
  17. data(){
  18. return{
  19. name: 'inputAll',
  20. arr: ['', '' ]
  21. }
  22. },
  23. created(){
  24. _this = this;
  25. },
  26. methods:{
  27. uploadImg(i){
  28. console.log(i, this.$refs[this.name][i]);
  29. this.$refs[this.name][i].click();
  30. },
  31. uploadImgSave(e, i){
  32. var reader = new FileReader();
  33. reader.onload = (function (file) {
  34. return function (e) {
  35. _this.$set(_this.arr, i, this.result);
  36. }
  37. })(e.target.files[0]);
  38. reader.readAsDataURL(e.target.files[0]);
  39. }
  40. },
  41. }
  42. </script>