JS的异步编程
异步是啥?程序的不连续执行就是异步,一个任务分几个部分,几个时间段完成
同步就是程序连续执行,1没执行完2就只能等着
回调函数
JS对异步编程的实现,就是回调函数。把异步任务的第二段单独写在一个函数里面,等异步任务的第一段执行完毕的时候,就调用这个函数啊
fs.readFile('etc/passwd',function(err,data){
if(err) throw err
console.log(data)
})
上述代码中,readFile函数的第二个参数,就是回调函数,也就是任务的第二段,等到操作系统返回/etc/passwd这个文件之后,回调函数才会执行。
回调函数的第一个参数是err(如果没有错误,该参数就是null)?原因是执行分为两段,在这两段之间抛出的错误,程序无法捕捉,只能当成参数,传入第二段.
Promise回调函数本身没问题,问题在于多个回调函数的嵌套。假定读取A文件之后,再读取B文件 。造成回调噩梦callback hell
fs.readFile(fileA,function(err,data){
if (err) throw ...
测试功能页
bd25ed9264b080267271e137e33d0ce1874c72b7e3d7ffc49271f9d090e14bb8e7eeef201904066dc5fec581483b6f5b230759b47f327056f2c6087fb4372224ff41dd6a14a51a6f9c19a545b59bb412952ce03ecc8be9d6c47f8d0ee5714a97ce39d1a3050947b9f06c60dbb003869079b26abe7da67db1da28532cb1d35841be69ec6ddfe28bdcab1b34104726ee29f7d23b13cab0b9c924973d25e49b211cf467d4bdf99881bce00692fa10a01be08aff185b49104633183b9060185aafc7ac146a6e5fd2ae7c7b4a277a599d853ccb3bee614272cf7e81bbaff8829d5b77bdbec1568eefe7a02bfd3ef2533380d0bd2993ada136b49b7 ...
github配置cdn注意事项
Github+CDN+Jsdelivrgithub上新建个仓库存放这些需要cdn加速的资源。在Releases中创建cdn加速。图中Choose a tag 就是版本号,通过链接https://cdn.jsdelivr.net/gh/JingWZeng/blog-CDN@1.0/img/访问cdn加速的文件夹,https://cdn.jsdelivr.net/gh/JingWZeng/blog-CDN@1.0/img/[文件名]访问具体的文件。
picGo如果需要利用cdn加速的话,只需要把默认地址设置成https://cdn.jsdelivr.net/gh/JingWZeng/markdownImg。markdownImg是我的仓库名
可编辑的div
如果利用textarea的输入框,只能输入文本,无法输入图片等。比较好的方法是利用可编辑的div进行实现。
div的可编辑div要完成可编辑,只需要设置contenteditable = "true"即可实现。我们可以监听用户输入的区域,用户输入的时候,获取其中的innerText,之后进行字数的限制判断,重新设置其innerHtML,超出的字数显示成其他颜色。在提交之前,对表单进行预验证,要求用户删除多余的字符,方可提交给后端。
🍡可编辑的div的难点在于光标难于控制,因此设置html的时候利用两层div重叠的方式进行解决
上层的div用于文本的输入,背景颜色透明
下层的div节点用于高亮超出的部分文字,文字颜色设置为透明,超出的部分设置背景颜色进行高亮
🌭 bug1:div的高度自适应
<div class="box" contenteditable="true" ref="box"></div>
<div class="hightLight"></div>
.box{
width:400px;
min-hei ...
butterfly的Tag-Plugins
{% note red 'fas fa-fan' flat%}
这是三片呢?还是四片?
{% endnote %}
你是刷 Visa 还是 UnionPay
2021年快到了….
小心开车 安全至上
这是三片呢?还是四片?
你是刷 Visa 还是 UnionPay
剪刀石头布
前端最讨厌的浏览器
更多信息见:butterfly官网标签外挂
Vue2文档总结
data对象所有的属性被加入到Vue的响应式系统(被创建的时候就已经存在才是,临时加入的不是)一开始的声明其实就是让他在创建的时候就存在。如果用如果用Objectfreeze(obj),阻止obj修改自己的属性,所以响应式系统就不能追踪他的变化
v-once只执行一次插值,当数据改变的时候,插值的内容不会再更新
v-html可以把html代码执行出来,用户提供的信息不要这样用,Xss攻击,只对可信的东西用就好。Xss攻击可以利用Xss库进行配置
用在html属性上面不可以用{{}}`,需要用`v-bind`的。其实如果`v-bind`的属性是`false`\ `null` \ `undefined`的话,渲染出来的该`html`元素不会含有该属性的。`{{}}和v-bind中都可以放JavaScript表达式,v-bind的属性名会被强制转换成小写,
v-bind 和 v-on的缩写:herf = "ur1"
//动态参對的缩写
:[key] = "url"
@click = "dosomething"
@[event] = "dosomething"
计算属性的使用和普通属性一样 ...
Vuex文档总结
statestate里面的值的处理方式与computed属性一样,依赖data里面的值并且做缓存(也就是混入computer)
state:{
userId:null
}
1. this.$store.state.[name]
2. import {mapState} from 'Vuex'
// 混入computed里面
computed:{
// ...mapState(['name1'],['name2']...)
...mapState({
name1:state=>state.name1,
name2:state=>state.name2,
...
})
}
gettergetter里面的值的处理方式与computed属性一样,依赖data里面的值并且做缓存(也就是混入computer)
getter:{
setGender(state){
const gender = {0:'保密',1:'男',2:'女'}
return gender[1] ...
Web存储
CookieCookie是S端发送C端的一个小数据,下次请求的时候C端带上该数据,S端确认是不是同一个浏览器发送过来的数据。
用处
保持登录的状态
个性化设置(主题)
浏览器的行为跟踪缺点: Cookie会造成额外的性能开销,每次请求的时候会携带。
S端收到http请求的时候,S端在响应报文首部添加一个set-cookie的选项, C端收到之后会保存下Cookie,之后的C端每次请求通过请求头部将Cookie信息携带上set-Cookie:<cookie名>=<cookie值>cookie的分类
会话期的cookie(浏览器关闭之后就没有了,不需要设置过期的时间)
持久性的cookie(有一个过期时间,设定的时间只跟C端有关,和S端无关的)
第三方的cookie(cookie是同源的,第三方的cookie就是域和页面的域不同,只用于广告追踪)
cookie的属性
secure:表示cookie只可以通过https进行传输,不可以使用http进行
httpOnly:避免xss攻击的,就是该cookie设置了httpOnly的话, JavaScript ...
Vue生命周期总结
创建阶段
beforeCreatedata和methods中的数据还没有被初始化
createddata和methods中的数据已经被初始化,最早在这里进行操作他们的数据
beforeMounte模板已经在内存中编辑完成了,但是还没有把模板渲染到页面中去。此时对dom元素无法进行相关的操作,页面中的元素还没有真正的替换出来,页面还是旧的
mounted内存中的模板,已经真实的挂载到了页面中,用户可以看到已经渲染好的页面。实例披创建好的最后步,如果没有其他操作,他就安安静静的保存在内存之中运行阶段
beforeUpdotedata里面的数据发生改变的时候才会触发0次或者多次。表示界面还没有被更新,但是数据已经被更新了。数据与页面不同步更新的,虚拟dom的特性
updated数据和页面更新已经同步了,就是虚拟dom已经被变成了真实的dom销毁阶段
beforeDestroyvue实例的销毁阶段,实例身上所有的data、 methods以及指令和过这器等等还是可用的状态。
destroy这里组件以及被完全销毁,实例身上所有的data、methods以及指令和过这器等已经是不可用的状态。
Vue-Router文档总结
两种声明的方式
声明式导航<router-link :to='about'></router-link>
<router-link :to='{path:'about'}'></router-link>
<router-link :to='{name:'about'}'></router-link>
<router-link :to='{name:'about',params:{userId:'123'}}'></router-link>
<router-link :to='{name:'about',query:{plan:'private'}}'></router-link>
编程式导航动态路由匹配: url地址中有一部分是一样的,另外一部分是动态变化的,这些动态变化就是路由参数,也就是动态路由匹配。两种方式:
用路由对象
使用props
当props是boolean时候,路由对象里面的参数会被设置成组件的属性 props:['id']
当props是Obj ...