vue中将html字符串转换成html后遇到的问题小结


Posted in Javascript onDecember 10, 2018

今天整理之前做vue项目时遇到的一些问题,发现了当时遇到的一个很小但是又会引出很多问题的一个问题(总之就是很有意思,听我慢慢给你到来),这个问题就是当时处理后端数据时,如何将后端返回来的字符串转换成html标签,其实根据vue官网的一个v-html方法是不是觉得很简单,当时我也是这样想的,可是我发现了几个问题(官网给出的动态渲染任意 HTML 容易导致 XSS 攻击的问题我就不说了,在这里我只是用它来渲染数据):

第一,当我用v-html将后端字符串转换成了html标签后,发现我在那个字符串中解析出来的html里面设置的样式没有加上;

第二,当我们使用v-html的时候,是会自动生成一个div标签的,有时候这个小小的div标签可能会影响到我们的布局,这个时候你会想到用template来替代div不就完事了,可是很不幸,给出我试验后的结果让你看看吧

<div v-html="'<p>渴望成为大牛的男人</p>'"></div>





//页面上成功渲染出了我们想要的p标签,但同时它的外围也被一个div标签包裹着
<template v-html="'<p>渴望成为大牛的男人</p>'"></template>



//页面上并没有出现我们想要的这个p标签

   有没有发现一个小小的需求就会带来很多意想不到的问题,让我不禁感叹,代码的世界真的是神奇啊,废话不多说,接下来我给出这两个问题的解法

我们先来解决第一个问题:

    解决这个问题的开始,我们要先了解一下scoped,在vue中,当你在一个style标签上加了scoped属性时,这个style标签内的样式将会被锁死在当前这个组件内,为的就是避免我们的样式出现混乱,假如说你的项目中如果每个style标签上都加了scroped这个属性,从某种意义上说就相当于实现了样式的模块化。

为什么我要说scoped这个属性,因为在你加了scroped之后,当你引用一些第三方组件,比如swiper,当你想要去覆盖它的样式的时候,你会发现覆盖不了,那么我们后来通过v-html引入的html元素肯定也逃不掉,这个时候我们可以通过一种特殊的方式,穿透scoped,比如这样:

<style scoped>
  >>>需要穿透的类名 {
    样式
  }
</style>

嗯对,就是这个姿势,我们使用>>>就可以实现一个穿透效果,让我们在使用scoped的情况下,去修改其他组件的样式,还有另外一种方法就是你可以把需要穿透的样式写到另一个style标签中,不加scoped,这样也可以,看你个人需求。

接下来我们解决第二个问题,同时我们把这个问题转化为如何将一个html字符串转换为html元素:

在这里我们可以想将一个html字符串转换为html元素的话,我想到的办法就只能进行DOM操作了,在vue中,要进行DOM操作的话,我们可以使用自定义指令,如果有小伙伴对自定义指令不了解的话,可以去vue的官方文档先看下自定义指令是什么,官网链接:https://cn.vuejs.org/v2/guide/custom-directive.html

解决这个问题的大致思路是这样的:我们可以在要加入这个html字符串的元素绑定一个自定义指令,我们在data中定义一个htmlStr变量用来存储字符串,绑定到我们的自定义指令上,然后在我们这个自定义指令中我们可以获取到这个当前这个元素的dom节点还有我们需要解析的字符串,我们通过原生js的innerHtml方法将字符串渲染到页面上即可:

data(){
    return {
      htmlStr:'<p>渴望成为大牛的男人</p>'   //你可以把后端html字符串数据来赋值给htmlStr
    }
  },
<main v-exchangeHtml:foo='htmlStr'>   //定义自定义指令
//全局注册自定义指令
Vue.directive('exchangeHtml',{   
  bind: function(el,foo){
   console.log(el,foo)
   el.innerHTML += foo.value
 }
})

我把el和foo打印出来,以便大家理解,这是打印出来的结果

vue中将html字符串转换成html后遇到的问题小结

自此,我们就完成了直接将html字符串转换成我们需要的html元素并且添加了进来

总结

以上所述是小编给大家介绍的vue中将html字符串转换成html后遇到的问题小结 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Opacity.js
Jan 22 Javascript
eval与window.eval的差别分析
Mar 17 Javascript
获取客户端电脑日期时间js代码(jquery)
Sep 12 Javascript
js模仿html5 placeholder适应于不支持的浏览器
Jan 13 Javascript
js判断输入是否为数字的具体实例
Aug 03 Javascript
浅谈javascript中onbeforeunload与onunload事件
Dec 10 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
Jul 12 Javascript
拖动时防止选中
Feb 03 Javascript
Angular2 父子组件数据通信实例
Jun 22 Javascript
JS实现的文字间歇循环滚动效果完整示例
Feb 13 Javascript
解决Vue中mounted钩子函数获取节点高度出错问题
May 18 Javascript
laydate只显示时分 不显示秒的功能实现方法
Sep 28 Javascript
vue的.vue文件是怎么run起来的(vue-loader)
Dec 10 #Javascript
Bootstrap 实现表格样式、表单布局的实例代码
Dec 09 #Javascript
Bootstrap 按钮样式与使用代码详解
Dec 09 #Javascript
Vue源码中要const _toStr = Object.prototype.toString的原因分析
Dec 09 #Javascript
vue form check 表单验证的实现代码
Dec 09 #Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
Dec 09 #Javascript
vue打包之后生成一个配置文件修改接口的方法
Dec 09 #Javascript
You might like
在IIS上安装PHP4.0正式版
2006/10/09 PHP
PHP-redis中文文档介绍
2013/02/07 PHP
PHP中对缓冲区的控制实现代码
2013/09/29 PHP
php自动识别文件编码并转换为UTF-8的方法
2014/06/12 PHP
php绘制一个矩形的方法
2015/01/24 PHP
PHP自定义递归函数实现数组转JSON功能【支持GBK编码】
2018/07/17 PHP
在修改准备发的批量美化select+可修改select时,在非IE下发现了几个问题
2007/01/09 Javascript
JavaScript CSS修改学习第三章 修改样式表
2010/02/19 Javascript
js去空格技巧分别去字符串前后、左右空格
2013/10/21 Javascript
使用JavaScript的AngularJS库编写hello world的方法
2015/06/23 Javascript
JS实现的适合做faq或menu滑动效果示例
2016/11/17 Javascript
JSONP基础知识详解
2017/03/19 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
2017/03/22 Javascript
详解vue2 $watch要注意的问题
2017/09/08 Javascript
详解NODEJS的http实现
2018/01/04 NodeJs
详解JavaScript添加给定的标签选项
2018/09/17 Javascript
Nodejs文件上传、监听上传进度的代码
2020/03/27 NodeJs
微信小程序实现页面监听自定义组件的触发事件
2020/11/01 Javascript
element-plus一个vue3.xUI框架(element-ui的3.x 版初体验)
2020/12/02 Vue.js
Vue中inheritAttrs的使用实例详解
2020/12/31 Vue.js
浅谈Python中函数的参数传递
2016/06/21 Python
Python字符编码判断方法分析
2016/07/01 Python
Python爬虫使用浏览器cookies:browsercookie过程解析
2019/10/22 Python
Python Tkinter模块 GUI 可视化实例
2019/11/20 Python
Python数据可视化:饼状图的实例讲解
2019/12/07 Python
基于keras 模型、结构、权重保存的实现
2020/01/24 Python
python给list排序的简单方法
2020/12/10 Python
使用css3实现超炫的loading加载动画效果
2014/05/07 HTML / CSS
CSS3 真的会替代 SCSS 吗
2021/03/09 HTML / CSS
命名空间(namespace)和程序集(Assembly)有什么区别
2015/09/25 面试题
为什么说Ruby是一种真正的面向对象程序设计语言
2012/10/30 面试题
大宝sod蜜广告词
2014/03/21 职场文书
关于运动会的广播稿(10篇)
2014/09/12 职场文书
民事调解协议书
2016/03/21 职场文书
python 遍历磁盘目录的三种方法
2021/04/02 Python
分享五个Node.js开发的优秀实践 
2022/04/07 NodeJs