如何解决Vue.js中的“属性或方法未在实例上定义但在渲染期间引用的问题”?

如何解决如何解决Vue.js中的“属性或方法未在实例上定义但在渲染期间引用的问题”?

我正在尝试从前端请求通知,但出现此错误

属性方法“ requestPermission”未在实例上定义,但在渲染期间被引用。通过初始化该属性,确保该属性在data选项中或对于基于类的组件都是反应性的。

代码中,正确拼写了方法requestPermission。但是我仍然面临着同样的问题。

Vue模板

<template>
    <div>
        <div class="sticky-top alert alert-primary" v-if="requestPermission"
             v-on:click="enableNotifications">
            Want to kNow when we publish a new recipe?
            <button class="btn btn-sm btn-dark">Enable Notifications</button>
        </div>
        <nav class="navbar navbar-expand-md navbar-light navbar-laravel">
            <div class="container">
                <router-link :to="{name: 'home'}" class="navbar-brand">Notification PWA</router-link>
                <button
                    class="navbar-toggler"
                    type="button"
                    data-toggle="collapse"
                    data-target="#navbarSupportedContent"
                    aria-controls="navbarSupportedContent"
                    aria-expanded="false"
                >
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="collapse navbar-collapse" id="navbarSupportedContent">
                    <ul class="navbar-nav ml-auto">
                        <li>
                            <router-link :to="{name: 'home'}" class="nav-link">Recipes</router-link>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>

    <div class="py-4">
            <router-view></router-view>
        </div>
    </div>
</template>

Vue.js中的脚本

<script>
    import firebase from "firebase/app";
    import axios from "axios";
    import "firebase/messaging";

    export default {
        data() {
            return {
                // use a getter and setter to watch the user's notification preference in local storage
                get requestPermission() {
                    return (localStorage.getItem("notificationPref") === null)
                },set requestPermission(value) {
                    console.log(value)
                    localStorage.setItem("notificationPref",value)
                }
            }
        },methods: {
            registerToken(token) {
                axios.post(
                    "/api/register-token",{
                        token: token
                    },{
                        headers: {
                            "Content-type": "application/json",Accept: "application/json"
                        }
                    }
                ).then(response => {
                    console.log(response)
                });
            },enableNotifications() {
                if (!("Notification" in window)) {
                    alert("Notifications are not supported");
                } else if (Notification.permission === "granted") {
                    this.initializefirebase();
                } else if (Notification.permission !== "denied") {
                    Notification.requestPermission().then((permission) => {
                        if (permission === "granted") {
                            this.initializefirebase();
                        }
                    })
                } else {
                    alert("No permission to send notification")
                }
                this.requestPermission = Notification.permission;
            },initializefirebase() {
                if (firebase.messaging.isSupported()) {
                    let config = {
                        apiKey: "xxxxxxxxxxxxxxxxxxx",authDomain: "xxxxxxxxxxxxxx",projectId: "xxxxxxxxxx",messagingSenderId: "xxxxxxxxxxxxx",appId: "xxxxxxxxxxxxxxxxxxxxxxxxxx",};
                    firebase.initializeApp(config);
                    const messaging = firebase.messaging();

                    messaging.getToken()
                        .then((token) => {
                            console.log(token);
                            this.registerToken(token)
                        })
                        .catch((err) => {
                            console.log('An error occurred while retrieving token. ',err);
                        });

                    messaging.onMessage(function (payload) {
                        console.log("Message received",payload);
                        let n = new Notification("New Recipe alert!")
                    });
                }
            }
        }
    };
    

有什么办法可以解决这个问题?

解决方法

我认为您应该为此使用计算属性:

export default {
  data () {
    return {
      requestPermissionValue: null
    }
  },computed: {
    requestPermission: {
      get () {
        return this.requestPermissionValue
      },set (value) {
        this.requestPermissionValue = value
        localStorage.setItem("notificationPref",value)
      }
    }
  },created () {
    this.requestPermissionValue = localStorage.getItem("notificationPref") === null
  }
}

只要您不更改其他组件中的notificationPref localStorage项,它就可以正常工作。

创建的挂钩创建基于localStorage的值的初始副本。 localStorage不是被动的,这就是为什么您需要数据中的属性。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?