FillItem.vue 1.4 KB

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