在vue开发中,很多人遇到过这样的情况:在模板里写{{ window.location.href }}无法正常工作,但在script标签里使用window.location.href却能正常获取页面地址。这不是程序错误,而是Vue框架的特意设计。
先看一个具体例子。在Vue组件中:
<template>
<!-- 这些写法无法工作 -->
<div>{{ window.location.href }}</div>
<div>{{ document.title }}</div>
<!-- 这些写法可以工作 -->
<div>{{ Math.random() }}</div>
<div>{{ Date.now() }}</div>
</template>
<script>
export default {
data() {
return {
// 这里可以正常使用window
currentUrl: window.location.href,
pageTitle: document.title
};
},
mounted() {
// 这里也能正常使用
console.log(window.navigator.userAgent);
}
};
</script>可以看到,同样的window对象,在模板和script中的处理方式完全不同。
Vue团队在设计时,为模板表达式设置了特殊环境。这主要基于三个重要原因:
首先是安全问题。如果模板能随意访问window,恶意代码可能通过模板执行危险操作,比如{{ window.location.href = "恶意网站" }}或者{{ window.localStorage.clear() }}。这会带来严重的安全风险。
其次是性能考虑。限制可访问的变量范围,能让模板渲染更快。如果每次都要在整个全局作用域中查找变量,会明显降低渲染速度。
最后是代码结构。Vue希望开发者把逻辑放在合适的地方,模板主要负责展示数据,复杂操作应该放在methods或computed中。
Vue通过白名单控制模板能访问哪些全局对象。在Vue源码中,有一个允许访问的全局变量列表,包括Math、Date、JSON等常用对象,但不包含window、document等。
当模板中访问变量时,Vue按顺序查找:
先在组件自身的data、computed、methods中找
然后在Vue提供的全局属性中找
最后检查是否在白名单中
如果都不满足,就返回undefined。
虽然不能直接访问,但有多种方法可以实现需求:
使用计算属性(最推荐)
computed: {
currentUrl() {
return window.location.href;
},
pageTitle() {
return document.title;
}
}使用方法
methods: {
openNewWindow(url) {
window.open(url, "_blank");
}
}注册为全局属性(适合频繁使用的属性)
// main.js中
const app = createApp(App);
app.config.globalProperties.$window = window;
// 组件模板中
// {{ $window.innerWidth }}使用Composition api(Vue 3)
import { ref, onMounted, onUnmounted } from "vue";
export function useWindowSize() {
const width = ref(window.innerWidth);
const height = ref(window.innerHeight);
const updateSize = () => {
width.value = window.innerWidth;
height.value = window.innerHeight;
};
onMounted(() => {
window.addEventListener("resize", updateSize);
});
onUnmounted(() => {
window.removeEventListener("resize", updateSize);
});
return { width, height };
}为什么Math.random()可以在模板中使用?
因为Math在Vue的白名单中。Vue认为数学计算、日期处理等内置对象是安全的。
react有类似限制吗?
React没有这种限制,因为React的JSX本质就是JavaScript。这也意味着React开发者需要自己注意安全问题。
在实际项目中,建议遵循这些原则:
这种分离让代码更清晰,也更容易维护。比如监听窗口大小变化:
// 使用组合式函数
import { useWindowSize } from './composables/useWindowSize';
export default {
setup() {
const { width, height } = useWindowSize();
return {
windowWidth: width,
windowHeight: height
};
}
};Vue模板不能直接访问window不是框架缺陷,而是经过深思熟虑的设计选择。这种设计让应用更安全、性能更好、代码更规范。虽然刚开始可能觉得不方便,但习惯后会发现这种约束带来的好处。
理解这个设计背后的原因,能帮助我们写出更好的Vue代码,也能更深入地理解Vue框架的设计理念。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!
下一代Jquery模板JsRender。jsrender官网号称简单直观、强大轻快可扩展。压缩体积也只有8.9kb,可以单独在浏览器或node中使用,也可以配合jQuery使用。
ejs是一个款简单的纯js模板引擎,其主要作用是:用来从JSON数据中生成HTML字符串。
artTemplate是腾讯开源的前端模板框架,和mustache,handlerbars类似,在web项目中可以很方便的使用,上手快,如果用过mustache,那么几乎可以快速切换到template框架上来。
们通过 vue 对象修改数据可以直接影响到 DOM 元素,但是,如果直接修改 DOM 元素,却不会影响到 vue 对象的数据;我们把这种现象称为 单向数据绑定 ;通过 v-model 指令展示表单数据,此时就完成了 双向数据绑定
客户最近有一个需求,大致的意思是提供一个 word文档,让其作为一个模板,在发送邮件的时候能够实现按照这个模板的样式和内容,替换其中 的一些字段,作为邮件的内容发给收件人
在开发项目中,后台管理因为面向群体相对比较固定,使用Bootstrap后台模板可以让后端开发很轻松的就展现给客户一个响应式的后台,节约前端开发的时间。下面给大家分享一下最值得拥有的免费Bootstrap后台管理模板
模板引擎负责组装数据,以另外一种形式或外观展现数据。浏览器中的页面是 Web 模板引擎最终的展现。无论你是否直接使用模板引擎,Web 模板一直都在,不在前端就在后端,它的出现甚至可以追溯到超文本标记语言 HTML 标准正式确立之前。
在软件开发中,研发效率永远是开发人员不断追求的主题之一。于公司而言,在竞争激烈的互联网行业中,产出得快和慢也许就决定着公司的生死存亡;于个人而言,效率高了就可以少加班,多出时间去提升自己、发展爱好、陪伴家人,工作、生活两不误
文本绑定,两个大括号,中间加上data里面的数据,message里面不仅可以是变量还可以是表达式;JS表达式(计算、拼接、只能是单个表达式)插入HTML代码(慎用!防止XSS攻击 ),我们可以直接在data里面定义html代码
在软件开发中,研发效率永远是开发人员不断追求的主题之一。于公司而言,在竞争激烈的互联网行业中,产出得快和慢也许就决定着公司的生死存亡;于个人而言,效率高了就可以少加班,多出时间去提升自己
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!