使用antd-design-vue 模态框组件 使用v-model报错的问题

在封装模态框组件的时候,遇到一个问题,
1、模态框的显示与隐藏是由父组件传递过来的visible控制,在模态框上使用默认的v-mode,使用计算属性缓存visible这个属性值,,当模态框组件改变了这个值,会报:[Vue warn]: Computed property “showModal” was assigned to but it has no setter.然后再设置set方法,会导致栈溢出。

<a-modal v-model="showModal"
           :title="title"
           okText="确定"
           cancelText="取消"
           @cancel="handleOk"
           @ok="handleOk">
    <p>Some contents...</p>
    <p>Some contents...</p>
    <p>Some contents...</p>
  </a-modal>

<script>
   props: {
    visible: {
      type: Boolean,
      default: false
    }
  computed: {
    showModal: {
      get() {
        return this.visible
      },
      set(val) {
        this.showModal = val
      }
    }
  }
  </script>

2、当把属性值放到data中,也会有问题,模态框直接不显示了。
解决办法:
不在模态框组件上使用v-model,而是使用动态绑定的visible属性

 <a-modal :visible="visible"
           :title="title"
           okText="确定"
           cancelText="取消"
           @cancel="handleOk"
           @ok="handleOk">
    <p>Some contents...</p>
    <p>Some contents...</p>
    <p>Some contents...</p>
  </a-modal>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,你需要安装 `ant-design-vue` 和 `vue3` 。 ``` npm install ant-design-vue@next npm install vue@next ``` 然后,你可以创建一个表单组件 `Form.vue` : ```vue <template> <a-form :form="form" @submit="handleSubmit"> <slot /> </a-form> </template> <script> import { defineComponent, ref } from 'vue'; import { Form } from 'ant-design-vue'; export default defineComponent({ components: { Form }, props: { initialValues: Object, onFinish: Function, onFinishFailed: Function, }, setup(props, { emit }) { const form = ref(null); const handleSubmit = (e) => { e.preventDefault(); form.value .validateFields() .then((values) => { if (props.onFinish) { props.onFinish(values); } }) .catch((error) => { if (props.onFinishFailed) { props.onFinishFailed(error); } }); }; return { form, handleSubmit, }; }, }); </script> ``` 在这个表单组件中,我们使用了 `a-form` 组件和插槽。我们为 `a-form` 组件绑定了 `form` 对象和 `submit` 事件。在组件的 `setup` 函数中,我们定义了一个 `form` 的引用,并且定义了一个 `handleSubmit` 函数,用于处理表单的提交事件。 接下来,我们可以创建一个表单项组件 `FormItem.vue` : ```vue <template> <a-form-item :label="label" :name="name" :rules="rules"> <slot /> </a-form-item> </template> <script> import { defineComponent } from 'vue'; import { FormItem } from 'ant-design-vue'; export default defineComponent({ components: { FormItem }, props: { label: String, name: String, rules: Array, }, }); </script> ``` 在这个表单项组件中,我们使用了 `a-form-item` 组件和插槽。我们为 `a-form-item` 组件绑定了 `label`、`name` 和 `rules` 属性。 现在,我们可以在 `Form.vue` 组件使用 `FormItem.vue` 组件来创建表单项了: ```vue <template> <Form :form="form" @submit="handleSubmit"> <FormItem label="Username" name="username" :rules="[{ required: true, message: 'Please input your username' }]"> <a-input v-model:value="formData.username" /> </FormItem> <FormItem label="Password" name="password" :rules="[{ required: true, message: 'Please input your password' }]"> <a-input-password v-model:value="formData.password" /> </FormItem> <FormItem> <a-button type="primary" html-type="submit">Submit</a-button> </FormItem> </Form> </template> <script> import { defineComponent, reactive } from 'vue'; import Form from './Form.vue'; import FormItem from './FormItem.vue'; export default defineComponent({ components: { Form, FormItem }, setup() { const formData = reactive({ username: '', password: '', }); const handleSubmit = (values) => { console.log(values); }; return { formData, handleSubmit, }; }, }); </script> ``` 在这个例子中,我们创建了两个表单项:用户名和密码。我们使用 `v-model` 指令将表单数据绑定到 `formData` 对象上。我们也定义了一个 `handleSubmit` 函数,在表单提交时输出表单数据。 最后,我们需要在 `main.js` 文件中引入 `ant-design-vue` 组件库和 `Form.vue` 组件: ```js import { createApp } from 'vue'; import App from './App.vue'; import Antd from 'ant-design-vue'; import 'ant-design-vue/dist/antd.css'; import Form from './components/Form.vue'; const app = createApp(App); app.use(Antd); app.component('Form', Form); app.mount('#app'); ``` 现在,我们就可以在 Vue 3 中使用 Ant Design Vue 的表单组件了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值