Angularjs 初始化未加载完毕闪烁问题解决 ng-cloak

本文讨论了AngularJS模板加载过程中遇到的样式冲突问题,通过实例展示了如何使用ng-cloak和CSS来解决闪烁问题,并介绍了其他解决方法。
<!--这样加载未完成会闪烁一下-->
<h3 ng-repeat="aricle in list"><a href="{{aricle.url}}">{{$index+1}}、{{aricle.title}}({{aricle.en}})</a></h3>


<!--可以通过添加ng-cloak解决-->
<h3 ng-repeat="aricle in list" ng-cloak class="ng-cloak"><a href="{{aricle.url}}">{{$index+1}}、{{aricle.title}}({{aricle.en}})</a></h3>

 

测试表明需添加css样式才能生效,原因是页面加载的时候angularjs未加载完成:

.ng-cloak{display:none;}

 

 

原因是angularjs源码最后添加该样式隐藏:

window.angular.element(document).find("head").prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none !important;}

 

其他解决方案:

 <div id="template1" ng-cloak>hello</div>
 <div id="template2" ng-cloak class="ng-cloak"> {{'hello IE7}}</div>
 <div id="template2" ng-bing="'hello IE7'"></div>

 

在 Vue 应用中,页面加载时可能会出现闪烁问题,尤其是在使用双大括号 `{{ }}` 绑定数据时。这是因为在 Vue 实例完成编译之前,模板中的变量会被原样显示,导致用户看到未渲染的变量名。为了解决这个问题,可以使用 Vue 提供的 `v-cloak` 指令。 `v-cloak` 的作用是防止在 Vue 实例编译完成之前显示未渲染的内容。当 Vue 实例编译完成后,`v-cloak` 会自动从元素上移除,从而允许元素正常显示。为了实现这一功能,通常需要配合 CSS 样式来隐藏带有 `v-cloak` 属性的元素。 ### 基本用法 可以在模板中的任意元素上添加 `v-cloak` 指令,例如: ```html <div id="app" v-cloak> {{ message }} </div> ``` 然后在 CSS 中定义以下规则: ```css [v-cloak] { display: none; } ``` 这样,在 Vue 实例完成编译之前,该 `div` 元素将不会显示。当 Vue 完成编译并成功渲染内容后,`v-cloak` 会被移除,元素将按照预期显示渲染后的内容。 ### 与 `!important` 结合使用 在某些情况下,尤其是使用了 `scoped` 样式或第三方库的样式时,为了确保 `v-cloak` 的样式优先级足够高,可以使用 `!important` 来增强其优先级: ```css [v-cloak] { display: none !important; } ``` ### 示例代码 以下是一个完整的示例,演示了如何使用 `v-cloak` 来防止页面闪烁: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>v-cloak Example</title> <style> [v-cloak] { display: none !important; } </style> </head> <body> <div id="app" v-cloak> <p>{{ blogName }}</p> <p>{{ blogUrl }}</p> </div> <!-- 引入 Vue --> <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script> <script> // 模拟页面加载延迟 setTimeout(() => { const app = Vue.createApp({ data() { return { blogName: "您好,欢迎访问 pan_junbiao的博客", blogUrl: "https://blog.youkuaiyun.com/pan_junbiao" }; } }); app.mount('#app'); }, 2000); </script> </body> </html> ``` 在这个示例中,页面会延迟 2 秒后再加载 Vue 实例,而 `v-cloak` 确保了在这段延迟时间内不会显示未渲染的变量名,从而避免了闪烁问题[^3]。 ### 注意事项 - `v-cloak` 只对当前元素生效,因此如果希望整个页面都避免闪烁,可以在根元素(如 `#app`)上使用它。 - 如果页面结构较为复杂,建议将 `v-cloak` 放在最外层容器上,以确保所有内部依赖 Vue 数据的内容都被隐藏直到渲染完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值