Vue 3 with Quasar - functions with parameters - TypeError: Cannot read properties of undefined

Vue 3 with Quasar - functions with parameters - TypeError: Cannot read properties of undefined

我遇到了 Vue 3 和 Quasar 的问题,我认为这是一个我不理解的 Vue 3 问题,所以我想问一下。我已经看到其他关于此错误的问题,缺少的部分是回调所需的粗箭头函数,因此 vue 正确绑定 this,但我已经这样做了。

我正在使用新组合 API,在设置内部我正在创建一个函数,然后在 post 的回调期间调用该函数。发生这种情况时,我收到错误 Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'showNotify').

奇怪的是,当我从 @click="showNotify('Vendor not created, response not 1',false)" 触发的测试通知按钮调用 showNotify 时,通知代码触发时没有错误。所以我推断这与提交有关。

这是简短的代码:

在模板部分:

<q-form
   class="q-gutter-md text-body2"
   autofocus
   @submit="onSubmit"
>
....
<div class="row  q-pt-md ">
  <q-btn label="Submit" type="submit" color="primary"/>
  <q-btn label="Reset" type="reset" color="primary" flat class="q-ml-sm" />
  <q-btn label='test notify' color='secondary' @click="showNotify('Vendor not created, response not 1',false)" />
</div>
...

然后我的脚本部分如下所示:

import { defineComponent, ref } from "vue";
import * as C from '../../Constants'
import { useQuasar } from 'quasar'

export default defineComponent({
    name:"VendorEntry",
    setup(){
        const $q = useQuasar();
       
        const name = ref(null);
        const number = ref(null);
        const address = ref(null);
        const phone = ref(null);
        const email = ref(null);
        const fax = ref(null);

        const showNotify = (messagein, positivein) => {
            let nopts = {
                message:messagein,
                color: (positivein ? 'positive':'negative'),
                icon: (positivein ? 'verified' : 'error'),
                timeout: (positivein ? 1500 : 3500)
            }
            
            $q.notify(nopts);
        }

        return{
            name,
            number, 
            address,
            phone,
            email,
            fax,
            showNotify,

            onSubmit(){

                const vendorPost = {
                    name: name.value,
                    number: number.value,
                    address: address.value,
                    phone: phone.value,
                    email: email.value,
                    fax: fax.value
                };

                console.log(JSON.stringify(vendorPost));

                fetch (`${C.BaseURLdev}/api/vendors`,
                {
                    method: 'post',
                    headers: {
                        'content-type': 'application/json'
                    },
                    body: JSON.stringify(vendorPost)
                }).then(response => response.json())
                  .then((data) => {
                      console.log(data);
                      if(data === 1){
                        this.showNotify("Vendor  was created successfully.", true);
                      }else{
                        this.showNotify("Vendor not created, response not 1", false);
                      }
                  }).catch(data => {
                      console.log(data);
                      this.showNotify("error thrown from post call, vendor not created", false);
                  });
            },
            
        }
    }
})

我认为这应该可行,但是当我提交表单时,这段代码总是在调用 this.showNotify 时出错。

我试过用几种不同的方式声明这个函数,像上面那样作为 const 和 returning,并且只是在 return return 中声明函数像 onSubmit() 一样,都给出相同的错误。

有人对此有什么想法吗?感谢观看!

按照传统,我在输入所有这些内容后就明白了。

在提交调用中,您需要在函数名称上加上括号才能正常工作。我不知道为什么,只是它需要在那里。

工作:

<q-form
   class="q-gutter-md text-body2"
   autofocus
   @submit="onSubmit()"
>

在 Vue 3 组合中 API 没有 this

如果您在设置方法中删除 this,一切都会正常进行。