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 相关文章推荐
javascript 动态生成私有变量访问器
Dec 06 Javascript
javascript上传图片前预览图片兼容大多数浏览器
Oct 25 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
Nov 22 Javascript
浅析javascript操作 cookie对象
Dec 26 Javascript
jquery日历插件datepicker用法分析
Jan 22 Javascript
jQuery插件支持同一页面被多次调用
Feb 14 Javascript
Bootstrap编写一个兼容主流浏览器的受众巨幕式风格页面
Jul 01 Javascript
jQuery表单设置值的方法
Jun 30 jQuery
详解@Vue/Cli 3 Invalid Host header 错误解决办法
Jan 02 Javascript
微信小程序人脸识别功能代码实例
May 07 Javascript
微信小程序封装分享与分销功能过程解析
Aug 13 Javascript
Vue切换Tab动态渲染组件的操作
Sep 21 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
php 网上商城促销设计实例代码
2012/02/17 PHP
php实现的一个简单json rpc框架实例
2015/03/30 PHP
PHP实现向关联数组指定的Key之前插入元素的方法
2017/06/06 PHP
laravel框架与其他框架的详细对比
2019/10/23 PHP
一些Javascript的IE和Firefox(火狐)兼容性的问题总结及常用例子
2009/05/21 Javascript
通过DOM脚本去设置样式信息
2010/09/19 Javascript
通过JavaScript控制字体大小的代码
2011/10/04 Javascript
使用jquery mobile做幻灯播放效果实现步骤
2013/01/04 Javascript
深入理解JavaScript系列(34):设计模式之命令模式详解
2015/03/03 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
2016/06/21 Javascript
js实现简单的计算器功能
2017/01/16 Javascript
vue实现提示保存后退出的方法
2018/03/15 Javascript
详解如何用babel转换es6的class语法
2018/04/03 Javascript
Vue EventBus自定义组件事件传递
2018/06/25 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
微信小程序自定义modal弹窗组件的方法详解
2020/12/20 Javascript
python list语法学习(带例子)
2013/11/01 Python
Python发送email的3种方法
2015/04/28 Python
Python封装shell命令实例分析
2015/05/05 Python
Python中单、双下划线的区别总结
2017/12/01 Python
一篇文章快速了解Python的GIL
2018/01/12 Python
python+pillow绘制矩阵盖尔圆简单实例
2018/01/16 Python
PyTorch 1.0 正式版已经发布了
2018/12/13 Python
python如何爬取网站数据并进行数据可视化
2019/07/08 Python
Python Multiprocessing多进程 使用tqdm显示进度条的实现
2019/08/13 Python
python破解bilibili滑动验证码登录功能
2019/09/11 Python
利用python读取YUV文件 转RGB 8bit/10bit通用
2019/12/09 Python
用python爬取历史天气数据的方法示例
2019/12/30 Python
Python如何对齐字符串
2020/07/30 Python
美国顶级品牌男士大码服装店:DXL
2017/08/30 全球购物
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物
心理健康心得体会
2014/01/02 职场文书
银行学习十八大感想
2014/01/11 职场文书
地方白酒代理协议书
2014/10/25 职场文书
2019个人工作自我评价范文(3篇)
2019/09/19 职场文书
浅析JavaScript中的变量提升
2022/06/01 Javascript