介
我比较喜欢使用 Vue 来开发,所以有时会深入研究其功能和特性。通过这篇文章,向你们介绍十个很酷的窍门和技巧,以帮助大家成为更好的 Vue 开发者。
随着Vue 2.6的推出,已经引入了插槽的简写方式,之前简写可用于事件(例如,@click表示v-on:click事件)或冒号表示方式用于绑定(:src)。例如,如果有一个表格组件,则可以按以下方式使用此功能:
如果要在created或mounted方法中定义自定义事件侦听器或第三方插件,并且需要在beforeDestroy方法中将其删除以免引起任何内存泄漏,则可以使用此功能。使用$on(‘hook:’)方法,我们可以仅使用一种生命周期方法(而不是两种)来定义/删除事件。
你可能已经知道可以将props验证为原始类型,例如字符串,数字甚至对象。我们还可以使用自定义验证器,例如,如果要针对字符串列表进行验证:
Vue 2.6 的最酷功能之一是可以将指令参数动态传递给组件。假设有一个按钮组件,并且在某些情况下想监听单击事件,而在其他情况下想监听双击事件。这就是动态指令派上用场的地方了:
有时,我们不同路由共用某些时,如果在这些路由之间切换,则默认情况下,共享组件将不会重新渲染,因为Vue 出于性能原因会重用该组件。但是,如果我们仍然希望重新渲染这些组件,则可以通过在路由器视图组件中提供:key属性来实现重新渲染。
这是一个非常酷的功能,可将所有prop从父组件传递到子组件。如果我们有另一个组件的包装器组件,这将特别方便。因为,我们不必一个一个将prop传递给子组件,而是一次传递所有prop:
上面的可以代替下面的做法
如果子组件不在父组件的根目录下,则可以将所有事件侦听器从父组件传递到子组件,如下所示:
如果子组件位于其父组件的根目录下,则默认情况下它将获得那些组件,因此不需要此小技巧。
默认情况下,每个Vue实例都可以访问$createElement方法来创建和返回虚拟节点。例如,可以利用它在可以通过v-html指令传递的方法中使用标记。在函数组件中,可以将此方法作为渲染函数中的第一个参数访问。
由于Vue CLI 3默认支持使用JSX,因此现在(如果愿意)我们可以使用JSX编写代码(例如,可以方便地编写函数组件)。如果尚未使用Vue CLI 3,则可以使用babel-plugin-transform-vue-jsx获得JSX支持。
默认情况下,v-model是@input事件监听器和:value props上的语法糖。但是,我们可以在Vue组件中指定一个模型属性,以定义使用什么事件和值
希望这些窍门和技巧对你有所帮助,如果你也知道哪些技巧,欢迎留言。
原文:https://www.telerik.com/blogs/12-tips-and-tricks-to-improve-your-vue-projects
利用new File();
function blobToFile(blob, filename, type) {
return new File([blob], filename, { type })
}
blobToFile('test info', 'test', 'text/plain' )
输出如下
更进一步了解可阅读MDN File - Web API 鎺ュ彛鍙傝€� | MDNMDN Web DocsMDN logoMozilla logo
Blob() - Web API 接口参考 | MDN讲解
利用URL.createObjectURL()
<input type="file" id="file">
<img id="img">
let img = document.getElementById('img')
let file = document.getElementById('file')
file.onchange = function () {
let imgFile = this.files[0]
img.src = URL.createObjectURL(imgFile)
img.onload = function () {
URL.revokeObjectURL(this.src)
}
}
更进一步了解可阅读 MDN URL.createObjectURL() - Web API 鎺ュ彛鍙傝€� | MDNMDN Web DocsMDN logoMozilla logo 讲解
let img = document.getElementById('img')
let file = document.getElementById('file')
file.onchange = function (e) {
let imgFile = this.files[0]
let fileReader = new FileReader()
fileReader.readAsDataURL(imgFile)
fileReader.onload = function () {
img.src = this.result
}
}
更进一步了解可阅读FileReader - Web API 鎺ュ彛鍙傝€� | MDNMDN Web DocsMDN logoMozilla logo简介
function dataURLToFile (dataUrl, fileName) {
const dataArr = dataUrl.split(',')
const mime = dataArr[0].match(/:(.*);/)[1]
const originStr = atob(dataArr[1])
return new File([originStr], fileName, { type: mime })
}
dataURLToFile('data:text/plain;base64,YWFhYWFhYQ==', '测试文件')
// File {name: '测试文件', lastModified: 1640784525620, lastModifiedDate: Wed Dec 29 2021 21:28:45 GMT+0800 (中国标准时间), webkitRelativePath: '', size: 7, …}
复杂处理方式如下
function dataURLToFile (dataUrl, filename) {
const dataArr = dataUrl.split(',')
const mime = dataArr[0].match(/:(.*);/)[1]
const originStr = atob(dataArr[1])
let n = originStr.length
const u8Arr = new Uint8Array(n)
while (n--) {
u8Arr[n] = originStr.charCodeAt(n)
}
return new File([u8Arr], filename, { type: mime })
}
dataURLToFile('data:text/plain;base64,YWFhYWFhYQ==', '测试文件')
console.log(dataURLToFile('data:text/plain;base64,YWFhYWFhYQ==','测试文件'));
// File {name: '测试文件', lastModified: 1640784866937, lastModifiedDate: Wed Dec 29 2021 21:34:26 GMT+0800 (中国标准时间), webkitRelativePath: '', size: 7, …}
利用canvas.toDataURL()
// html
<input type="file" accept="image/*" id="file">
// js
document.querySelector('#file').onchange = function () {
canvasToDataURL(this.files[0]).then(res => console.log(res))
}
function canvasToDataURL (file) {
return new Promise(resolve => {
const img = document.createElement('img')
img.src = URL.createObjectURL(file)
img.onload = function () {
const canvas = document.createElement('canvas')
canvas.width = img.width
canvas.height = img.height
const ctx = canvas.getContext('2d')
ctx.drawImage(img, 0, 0)
resolve(canvas.toDataURL('image/png', 1))
}
})
}
function dataUrlToCanvas (dataUrl) {
return new Promise(resolve => {
const img = new Image()
img.src = dataUrl
img.onload = function () {
const canvas = document.createElement('canvas')
canvas.width = this.width
canvas.height = this.height
const ctx = canvas.getContext('2d')
ctx.drawImage(this, 0, 0)
resolve(canvas)
}
})
}
const dataUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUh...'
dataUrlToCanvas(dataUrl)
.then(res => document.body.appendChild(res))
利用canvas.toBlob()
// html
<input type="file" accept="image/*" id="file">
// js
document.querySelector('#file').onchange = function () {
canvasToDataURL(this.files[0])
.then(res => console.log(res))
}
function canvasToDataURL (file) {
return new Promise(resolve => {
const img = document.createElement('img')
img.src = URL.createObjectURL(file)
img.onload = function () {
const canvas = document.createElement('canvas')
canvas.width = img.width
canvas.height = img.height
const ctx = canvas.getContext('2d')
ctx.drawImage(img, 0, 0)
canvas.toBlob(function (e) {
resolve(e)
}, 'image/png', 1)
}
})
将canvas转成Blob,然后将Blob转成file即可,可看最开始的文件类型转换流程图。
或将canvas转成dataURL,然后将dataURL转成file即可,可看最开始的文件类型转换流程图。
利用FileReader.readAsArrayBuffer()
function blobToArrayBuffer (blob, callback) {
const reader = new FileReader()
reader.readAsArrayBuffer(blob)
reader.onload = function () {
callback(this.result)
}
}
let blob = new Blob([1, 2, 3, 4, 5])
blobToArrayBuffer(blob, (arrayBuffer) => { console.log(arrayBuffer) })
// ArrayBuffer(5)
利用new Blob()
function arrayBufferToBlob (arrayBuffer, type) {
return new Blob([arrayBuffer], { type })
}
blobToArrayBuffer(new Blob([1, 2, 3, 4, 5]), (arrayBuffer) => {
console.log(arrayBufferToBlob(arrayBuffer, 'text/plain'))
// Blob {size: 5, type: 'text/plain'}
})
————————————————
版权声明:本文为CSDN博主「定栓」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44116302/article/details/122064841
最近在学习数据分析方面的问题,突然遇到了图形显示的问题,一如既往的将figure对象传入前端,用模板来实现,结局往往是那么的差强人意,显示不出来图像,.show()也不行,最后研究了一下,图像的传递方式采用BytesIO模块和Base64编码来解决了这个问题,下面就是我的成果,请大神们指点…………
from io import BytesIO
import base64
def fig_to_html(img):
# 转成图片的步骤
sio = BytesIO()
img.savefig(sio, format='png')
data = base64.encodebytes(sio.getvalue()).decode()
html = '''
<img src="data:image/png;base64,{}" />
'''
return html.format(data)
*请认真填写需求信息,我们会在24小时内与您取得联系。