属性或方法“sendResetMail”未在实例上定义,但在渲染期间引用

Posted

技术标签:

【中文标题】属性或方法“sendResetMail”未在实例上定义,但在渲染期间引用【英文标题】:Property or method "sendResetMail" is not defined on the instance but referenced during render 【发布时间】:2019-02-28 06:16:58 【问题描述】:

我对 Vue 比较陌生,当我尝试在我的 Vue 项目中使用此重置电子邮件模式时,我超级卡住了这个错误消息:

属性或方法“sendResetMail”未在实例上定义,但 在渲染期间引用。确保此属性是反应性的, 无论是在数据选项中,还是对于基于类的组件,通过 初始化属性。

我不知道我需要做什么才能完成这项工作。我遵循了 Vue 文档并在 data 选项中声明了 resetEmail。

忘记密码.vue:

    <template>
        <section>
            <a @click="isComponentModalActive = true">
                Forgot Password?
            </a>

            <b-modal :active.sync="isComponentModalActive" has-modal-card>
                <modal-form v-bind="resetEmail"></modal-form>
            </b-modal>
        </section>
    </template>

    <script>
    import firebase from 'firebase/app'
    import 'firebase/auth'
    import 'firebase/firestore'

    const ModalForm = 
      props: ['resetEmail'],
      template: `
                <form @submit.prevent="sendResetMail">
                    <div class="modal-card" style="width: auto">
                        <header class="modal-card-head">
                            <p class="modal-card-title">Forgot password?</p>
                        </header>
                        <section class="modal-card-body">
                            <b-field label="Email">
                                <b-input
                                    type="email"
                                    :value="resetEmail"
                                    placeholder="Your email"
                                    required>
                                </b-input>
                            </b-field>

                        </section>
                        <footer class="modal-card-foot">
                            <button class="button" type="button" @click="$parent.close()">Close</button>
                            <button class="button is-primary">Reset</button>
                        </footer>
                    </div>
                </form>
            `
    

    export default 
      components: 
        ModalForm
      ,
      data () 
        return 
          isComponentModalActive: false,
          resetEmail: '',
          feedback: null
        
      ,
      methods: 
        sendResetMail () 
          var auth = firebase.auth()
          var emailAddress = this.resetEmail

          auth.sendPasswordResetEmail(emailAddress).then(function () 
            // Email sent.
            console.log('email send')
          ).catch(function (error) 
            // An error happened.
            this.feedback = error.message
            console.log(error.message)
          )
        
      
    
    </script>

这是我使用 ForgotPassword.vue 组件的文件,

登录.vue:

<template>
  <section class="section">
    <div class="container">
      <div class="columns">
        <div class="column"></div>
        <div class="column is-half">
          <div class="box">
            <h1 class="title">Login</h1>
            <form @submit.prevent="login">
              <b-field label="Email" :message="feedback" :type="type">
                <b-input placeholder="Email" icon="email" type="email" v-model="email">
                </b-input>
              </b-field>
              <b-field label="Password" :message="feedback" :type="type">
                <b-input placeholder="Password" type="password" icon="textbox-password" password-reveal v-model="password">
                </b-input>
              </b-field>
              <button type="submit" class="button is-primary is-fullwidth">Login</button>
              <div class="field">
                <div class="control">
                  <p class="control has-text-centered">
                    <ForgotPassword/>
                  </p>
                </div>
              </div>
              <div class="field">
                <div class="control">
                  <p class="control has-text-centered">
                    Don't have an account?
                    <a href="/register">
                      <router-link :to=" name: 'Signup' ">
                        Signup
                      </router-link>
                    </a>
                  </p>
                </div>
              </div>
            </form>
          </div>
        </div>
        <div class="column"></div>
      </div>
    </div>
  </section>
</template>

<script>
import firebase from 'firebase/app'
import 'firebase/auth'
import 'firebase/firestore'
import ForgotPassword from '@/components/auth/ForgotPassword'

export default 
  name: 'login',
  metaInfo: 
    // specify a metaInfo.title, this title will be used
    title: 'Login',
    // all titles will be injected into this template
    titleTemplate: '%s | Wterdrops.com'
  ,
  components: 
    ForgotPassword
  ,
  data () 
    return 
      email: null,
      password: null,
      feedback: null,
      type: null
    
  ,
  methods: 
    login () 
      if (this.email && this.password) 
        firebase
          .auth()
          .signInWithEmailAndPassword(this.email, this.password)
          .then(cred => 
            this.$router.push(
              name: 'Dashboard'
            )
          )
          .catch(err => 
            this.feedback = err.message
          )
        this.feedback = null
       else 
        this.feedback = 'Please fill in both fields.'
        this.type = 'is-danger'
      
    
  

</script>

<style>
.login 
  max-width: 400px;
  margin-top: 60px;

</style>

如果有人能向我解释我缺少什么,我将不胜感激:)

【问题讨论】:

【参考方案1】:

你在引用

&lt;form @submit.prevent="sendResetMail"&gt;

在您的 ModalForm 组件中。

问题是这个模板在渲染时会在那个 ModalForm 组件模板上寻找方法 sendResetMail ,因为你的代码正在引用它。但是,此 sendResetMail 方法与此没有直接关联。

如果您需要在许多地方使用 sendResetMail,您可以考虑使用混合,或者直接将该方法移动到引用它的同一个组件“ModalForm”。

您还可以查看例如 eventBus 通过发出事件来触发该方法。

如果您只需要从 MOdalForm 组件调用它,最简单的选择是将 sendResetMail 直接移动到该组件。我相信这可能会解决您的问题。

【讨论】:

感谢您的回答!现在我明白为什么它不起作用了。我还通过将模板从 ForgotPassword 组件内的 ModalFrom 组件移动来使其工作。但我也想试试你的最后一个建议。所以最后一个菜鸟问题。如何在 ModalForm 组件中移动 sendResetMail 方法?我还没有看到有人这样做,也找不到一个很好的例子。抱歉,我对框架还是很陌生。

以上是关于属性或方法“sendResetMail”未在实例上定义,但在渲染期间引用的主要内容,如果未能解决你的问题,请参考以下文章

“属性或方法未在实例上定义,但在渲染期间引用”

未在实例上定义的属性或方法

Vue属性或方法未在实例上定义但在渲染期间引用?

Vue警告:属性或方法“item”未在实例上定义,但在渲染期间被引用

未在实例上定义但在渲染期间引用的属性或方法 I Vuex

Vue js错误:属性或方法“smoothie”未在实例上定义,但在渲染期间引用