form.vue 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. <script setup lang="ts">
  2. import { ref } from "vue";
  3. // 声明 props 类型
  4. export interface FormProps {
  5. formInline?: {
  6. user: string;
  7. region: string;
  8. };
  9. }
  10. // 声明 props 默认值
  11. // 推荐阅读:https://cn.vuejs.org/guide/typescript/composition-api.html#typing-component-props
  12. const props = withDefaults(defineProps<FormProps>(), {
  13. formInline: () => ({ user: "", region: "" })
  14. });
  15. // vue 规定所有的 prop 都遵循着单向绑定原则,直接修改 prop 时,Vue 会抛出警告。此处的写法仅仅是为了消除警告。
  16. // 因为对一个 reactive 对象执行 ref,返回 Ref 对象的 value 值仍为传入的 reactive 对象,
  17. // 即 newFormInline === props.formInline 为 true,所以此处代码的实际效果,仍是直接修改 props.formInline。
  18. // 但该写法仅适用于 props.formInline 是一个对象类型的情况,原始类型需抛出事件
  19. // 推荐阅读:https://cn.vuejs.org/guide/components/props.html#one-way-data-flow
  20. const newFormInline = ref(props.formInline);
  21. </script>
  22. <template>
  23. <el-form :model="newFormInline">
  24. <el-form-item label="姓名">
  25. <el-input
  26. v-model="newFormInline.user"
  27. class="w-[220px]!"
  28. placeholder="请输入姓名"
  29. />
  30. </el-form-item>
  31. <el-form-item label="城市">
  32. <el-select
  33. v-model="newFormInline.region"
  34. class="w-[220px]!"
  35. placeholder="请选择城市"
  36. >
  37. <el-option label="上海" value="上海" />
  38. <el-option label="浙江" value="浙江" />
  39. <el-option label="深圳" value="深圳" />
  40. </el-select>
  41. </el-form-item>
  42. </el-form>
  43. </template>