FillItem.vue 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <template>
  2. <view>
  3. <uni-popup type="bottom" background-color="#fff" ref="fillRef" class="FillPopup" :animation="true">
  4. <view class="popup-content">
  5. <input v-model.trim="result" @close="handleClose" :focus="focus" placeholder="请输入答案" :auto-blur="true" :adjust-position="true" style="position: z-index: 10;"
  6. @blur="onBlur" @confirm="handleConfirm" class="my-textarea" type="text" />
  7. </view>
  8. </uni-popup>
  9. </view>
  10. </template>
  11. <script setup>
  12. import {
  13. nextTick,
  14. ref,
  15. watch
  16. } from "vue";
  17. const fillRef = ref(null);
  18. const result = ref('');
  19. const focus = ref(false);
  20. const emits = defineEmits(['blur']);
  21. const props = defineProps({
  22. value: {
  23. type: String,
  24. default: ''
  25. },
  26. index: {
  27. type: Number,
  28. }
  29. })
  30. watch(() => props.value, (val) => {
  31. result.value = val;
  32. })
  33. function handleClear() {
  34. result.value = '';
  35. }
  36. function handleClose() {
  37. focus.value = false;
  38. }
  39. function showPopup() {
  40. fillRef.value && fillRef.value.open();
  41. nextTick(() => focus.value = true);
  42. }
  43. function handleConfirm() {
  44. fillRef.value && fillRef.value.close();
  45. }
  46. function onBlur() {
  47. emits("blur", {
  48. result: result.value,
  49. index: props.index
  50. });
  51. focus.value = false;
  52. }
  53. uni.$on("swiper-change", () => {
  54. emits("blur", {
  55. result: result.value,
  56. index: props.index
  57. });
  58. fillRef.value && fillRef.value.close()
  59. })
  60. defineExpose({
  61. showPopup,handleClear
  62. })
  63. </script>
  64. <style lang="scss" scoped>
  65. .popup-content {
  66. padding: 10px;
  67. }
  68. .my-textarea {
  69. height: 36px;
  70. line-height: 36px;
  71. }
  72. </style>