解决Vue再浏览器的控制台中更新属性不生效

解决Vue再浏览器上更新属性不生效

问题发现

最近在学习Vue2,再介绍-声明式渲染一文中,示例代码如下:

html 复制代码
<div id="app">
  {{ message }}
</div>
javascript 复制代码
var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  }
})

创建了第一个 Vue 应用,现在数据和 DOM 已经被建立了关联,所有东西都是响应式的。在看到我们要怎么确认呢?打开你的浏览器的 JavaScript 控制台 (就在这个页面打开),并修改 app.message 的值,你将看到上例相应地更新。

然后我就尝试再浏览器的控制台中修改对应属性值,期望能看到实时更新显示,执行结果如图所示:

并未达到预期效果,本地示例代码如下:

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        {{message}}
    </div>
    <script type="module">
        import Vue from 'https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.esm.browser.js'
        var app = new Vue({
            el: "#app",
            data: {
                "message": "hello, world"
            }
        })
    </script>
</body>
</html>

但是在代码里面执行却可以,示例代码如下:

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        {{message}}
    </div>
    <script>
		import Vue from 'https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.esm.browser.js'
        var app = new Vue({
            el: "#app",
            data: {
                "message": "hello, world"
            }
        })
        app.message="hello, vue"
    </script>
</body>
</html>

执行结果如图所示:

问题解决

"出师未捷身先死",正当我百思不得其解的时候,切换CDN版本,示例代码如下:

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
    	{{message}}
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>
    <script>
        var app = new Vue({
            el: "#app",
            data: {
                "message": "hello, world"
            }
        })
    </script>
</body>
</html>

竟然成功了,执行结果如图所示:

我们回来看之前的问题:为什么原 ES Modules 在浏览器中无法使用?先了解下什么是 ES Modules?

ES Modules (ECMAScript Modules )是 JavaScript 官方的模块化标准,自 ES6 (ES2015 )起正式引入。它为 JavaScript 提供了标准化的模块导入 / 导出机制,解决了传统 JavaScript 在大型应用中依赖管理和代码组织的痛点,模块具有独立的私有作用域,内部变量不会污染全局作用域。

现代浏览器(Chrome 61+、Firefox 60+、Safari 10.1+)直接支持 ES Modules,无需额外编译。

在 ES 模块中,var声明的变量会被限制在模块内部。

到这里我们也知道为什么再浏览器中无法使用了,如果为了达到演示效果,可以将实例挂载到window对象,示例代码如下:

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        {{message}}
    </div>
    <script type="module">
        import Vue from 'https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.esm.browser.js'
        // 将实例挂载到window对象,便于控制台访问
        window.app = new Vue({
            el: "#app",
            data: {
                "message": "hello, world"
            }
        })
    </script>
</body>
</html>

执行结果如图所示:

通过挂载到window对象,将对象设置(暴露)为全局作用域,这样便可在浏览器实时响应了。

至于为什么CDN引入的脚本,在浏览器中为什么可以直接使用?官网中解释如下:

直接下载并用 <script> 标签引入,Vue 会被注册为一个全局变量。

CDN 引入的传统脚本中,var会暴露到全局作用域,这是为了兼容历史设计和全局库的使用场景。

既然这样,不妨大胆想象,是不是普通的脚本也可以再浏览器的控制台中访问,是不是也可以进行实时响应呢,实践出真知,示例代码如下:

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app"></div>
    <script>
        var a = 100;
        document.getElementById("app").innerHTML = a;
    </script>
</body>
</html>

执行结果如图所示:

好像和预期的并不一样,这是为什么呢?

通常是由 JavaScript 的变量赋值机制、作用域规则或操作逻辑导致的。普通脚本中的变量不会自动响应外部变化,需通过代码主动修改(如定时器、事件监听)。修改app.message = '新值'后,视图会自动更新,主要依赖于其响应式系统 和数据劫持机制 。这是 Vue 的核心特性之一,与原生 JavaScript 的变量行为有本质区别。

相关推荐
jktantan2 小时前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
前端·javascript·vue.js
总要学点什么2 小时前
第89篇:三维特效-螺旋圆效果——让螺旋臂卷起一圈圈外扩的涟漪
开发语言·javascript·ecmascript·webgl·cesium·空间分析·1024程序员节
前端精髓3 小时前
调用openrouter的免费API模型
java·前端·javascript
螺丝钉tina9 小时前
[Playwright] [02]常用命令与调试:Debug UI、Mode和 Trace Viewer
开发语言·javascript·测试工具·ui·自动化
开开心心就好10 小时前
竖式除法出题工具,整除余数混合模式
运维·服务器·前端·javascript·ocr·perl·1024程序员节
এ慕ོ冬℘゜11 小时前
JS 事件循环、宏任务微任务:单线程底层原理 + 执行顺序
开发语言·javascript·ecmascript
web打印社区11 小时前
Lodop排障总纲-常见报错一张表
开发语言·前端·javascript·chrome·websocket
小郎君65811 小时前
(一)为什么表单需要第三种状态:disabled、readonly 与纯文本展示
前端·vue.js
程序员大阳11 小时前
副队长JavaScript教程(56)-DOM之表单操作
javascript·dom·表单操作
Dxy123931021612 小时前
JS AES加密详解
开发语言·javascript·ecmascript