怎么样vue可以动态解析后台给的html模板?

html-css013

怎么样vue可以动态解析后台给的html模板?,第1张

对于 vue 来说,模板本质就是一个字符串

vue 中的模板是有逻辑的,是动态的,如 v-if、v-for 等

与 html 格式很像,但有很大区别;html 是静态的,而 vue 模板是动态的

最终还是要转化为 html 来显示,怎么才能转换为 html 来显示呢?

模板最终必须转换为 JS 代码?

因为模板有逻辑 (v-if,v-for),必须用 JS 才能实现(前端中只有 JS 是图灵完备语言)

转换为html渲染页面,必须用 JS 才能实现渲染

因此模板最终要转换为一个 JS 函数(render 函数),(render 函数是指的渲染函数,并不一定就必须是 render 这个名字)

render函数

render 函数的 with 的用法

模板中,所有信息都包含在了 render 函数中

this 即 vm

price 就是 this.price,也是 vm.parice,也是 data.price

在项目中遇到解析html,发现v-html并不满足复杂的渲染,就使用jq来处理

1.v-html 处理简单的标签

如:text="<p>vue转换</p>"

html中解析:

<p v-html="text">{{text}}</p>

2.返回标签中还有img、a标签,使用v-html就不会转换方法如下:

使用jquery处理:

1.在标签定义class

<div class="descript"></div>

2.安装jq

npm install jquery --save

3.在使用的地方引入

import $ from 'jquery'

async loadProductDetail(cData) {

const { data } = await getProductDetail(cData)

this.descript = data.data.sku //接口返回数据赋值

this.loadhtml() //调用方法

},

loadhtml() {

('.descript').html(this.descript) //赋值

const srcdescript = ('.descript').find('img') //找到当前所有的a标签、img标签

for (let i = 0i <srcdescript.lengthi++) { //遍历

let a = srcdescript.eq(i).attr('href') //找到a标签的href属性

let b = evals.eq(i).attr('src') //找到img标签的src属性

//this. url + a) //赋值

srcdescript.eq(i).attr('src', this.$url + b)//赋值

//如果接口返回有就不添加:

// srcdescript.eq(i).attr('href', a) //赋值

//srcdescript.eq(i).attr('src', b)//赋值

}

}

(如有错误,欢迎指正~~)

在Vue要使用文件上传,找到一个bootstrap编写好的demo,打算直接用,嵌入vue中。demo主要使用jquery和webuploader,jquery和webuploader引用是使用script引入的。要兼容现在的Vue项目。

实验一:

打算在Vue的组件里使用script引入demo里同样引入的文件,发现文件没有被引用进来。

实验二:

打算将script引入文件的语句写成字符串,然后将字符串赋值给Vue组件内的元素的innerHTML里,发现项目报错,原因是innerHTML不允许写入script的内容,百度上说可以使用jquery来实现,试了一下一样不可以。百度一下Vue如何内容HTML,网上说用v-html里面放HTML,然后发现会报同样的错误。

实验三:

前面嵌入HTML文件的内容都失败了,就打算直接嵌入整个HTML文件。可以使用iframe实现内嵌HTML文件,如"<iframe frameborder=”no” style=”width:100%height:500px” src=”upload.html” ref=”iframe”></iframe>",将upload.html文件和内嵌它的Vue文件放在同一个额文件夹下,运行,界面<iframe>内显示"GET NO / upload.html",打开浏览器调试器发现,upload.html它的读取位置是项目的根目录下,修改src使浏览器可以读到upload.html对应的位置。

项目打包发布:

在项目打包发布到服务器的时候发现,使用iframe内嵌的HTML文件报错,由于个人对webpack不熟悉,不知道upload.html有没有打包进去。webpack打包HTML文件,在webpack.prod.conf.js文件中的webpackConfig的pulgins中添加

        发现webpack打包文件的时候,会把upload.html拎出来放打包下的static文件夹下的upload文件夹,发布服务器的时候发现upload.html照样没有显示出来,进入打包后的upload.html中,upload.html引用js找不到,js应该没有打包进来或者打包进来路径变了。使用important在HTML中引用js文件,打包后发布到服务器还是一样的问题。想着用requirejs去加载HTML,看能不能把HTML和HTML引用的js文件正确打包,由于可以参考内容过少,无从下手。

        不打包内嵌HTML了,把upload.html及引用文件放在一个文件夹下,加到webpack打包出来的dist的static文件夹下,将webpack中打包 调用upload.html路径的js调用路径内容改为在dist对应的路径,发布到服务器上文件终于可以使用了。(现在才想到可以配置webpack将upload.html及引用文件从打包独立出来)。

后续:

        项目从vue-cli2升级到vue-cli3,之前用的方式不适用了。

        vue-cli3用iframe嵌入HTML,HTML要放在public的static文件夹下,在iframe的src调用中,直接写"static/upload.html"就可以了。相较于vue-cli2,内嵌的HTML打包后不用上面的笨办法了。

        在内嵌的HTML页面,要求与后端的通讯要带上token,试着用js-cookie插件获取当前vue里的token,存入sessionStorage,再在内嵌的HTML页面获取sessionStorage,在本地运行是可以的,打包给后端部署后,在内嵌的HTML获取sessionStorage的值是null,不知道为什么。

        后面就在与后端通讯的js里使用jquery-cookie获取token,这个插件是基于jquery的,在引入该文件要先引入jquery

        uploader.js的请求添加请求头参数