DingMing

丁大铭的个人空间,用来分享一些前端小技巧,默默成长吧,哈哈

React-hook用法

useState

useEffect

在页面每次渲染完之后都会执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import React,{ useState,useEffect } from 'react';

const LikeBut = () => {
const [like, setLike] = useState(0);
const [on, setOn] = useState(true);
useEffect(()=>{
document.title = `点击了${like}次`
})
return(
<div>
<button onClick={()=>{setLike(like+1)}}>
{like} @
</button>
<button onClick={()=>{setOn(!on)}}>
{on?'on':'off'}
</button>
</div>
)
}

export default LikeBut;

在document监听click事件会有问题,所以sueEffect提供了清除回调

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import React , {useState,useEffect} from 'react';

const Mouse = () => {
const [ positions, setPositions ] = useState({x: 0, y: 0});

useEffect(()=>{
const updateMouse = (event)=>{
console.log('inner')
setPositions({x:event.clientX,y:event.clientY})
}
console.log('add listener')
document.addEventListener('click',updateMouse);

return ()=>{
console.log('remove listener')
document.removeEventListener('click',updateMouse)
}
})

return(
<p>X:{positions.x},Y:{positions.y}</p>
)

}

export default Mouse;


// 打印顺数
初始化时 add listener

点击后
inner
remove listener
add listener

控制useEffect的执行

1
2
useEffect(()=>{},[])
第二个参数可以被设置成触发条件

自定义hook

自定义hook 胜于 HOC 高阶组件 更加清晰 便于阅读

Hook 规则

  • 只在最顶层使用Hook
  • 只在React函数中使用Hook

如何在iOS13的Safari中检测设备名称

Apple iOS 13之后,iPad iOS 13的Safari中的window.navigator.userAgent与MacOS相同。像这样:

1
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15
1
2
3
所以不能用之前方式来判断 是否是 ipad 了

/iPad|iPhone|iPod/.test(navigator.platform)

Read More

模拟圆规-内容输出

最近接到了一个需求,使用JS制作一个圆规课件

功能如下:

图1 图1
图2 图2

图1和图2 分析

最开始的想法是 使用斜率 k=tanα=(y1-y2)/(x1-x2) 来时时的计算倾斜角来控制圆规的三部分运动;

可是后来我发现,我想多了:

  • 圆规的三部分不是直线运动而是抛物线
  • 还有一个最关键的点就是,常规的数学坐标系是从左下方开始的,而前端的坐标系默认是从左上方开始的

所以我必须转换思路

机智的我想想到了一个极简的想法,不管他是曲线运动还是什么斜率,无非逃不出一个界定的范围,运动什么的都让代码自行事项吧。

  1. 首先是记录圆规的三部分的初始坐标和倾斜角
  2. 其次是利率圆规的三部分的最大范围的坐标和倾斜角
  3. 拉伸范围是固定的,我们可以计算出圆规被拖动的距离的比例
  4. 在拉伸的时候时时改变圆规的三部分的最大范围的坐标和倾斜角的比例

这样就完成了图1和图2的需求

效果如下:图3

图3 图3

接下来来到了画圆的环节了

效果如下:

图4 图4

首先是画圆

这个画圆可是让我选择了好久,我的方案有这么几种:

序号 方案 采用与否的原因
1 直接用 JS 生成 Dom元素 往页面里不断push就行 不可行 生成Dom太多了 不太好
2 使用css boder 滚动(类似圆形进度条) 可行 备选状态 但是它消耗页面性能
3 使用canvas 画圆 尝试 感觉不可行(使用style 动态改变画布宽高是 内部画出来的圆是椭圆形) 有明显锯齿 需要优化
4 使用svg 画圆 目前采用的是这个方案

!!! 但是使用 svg circle 画圆他默认是顺时针旋转的 这里我用了一个骚操作 使用 transform:scaleY(-1); 使svg 水平镜像翻转。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<svg id="svg" :style="svgCss">
<circle class="path"
stroke="hotpink" // 划线的颜色
fill="none" // 填充颜色
stroke-width="1%" // 划线的宽度 可以使用百分比这是太棒了
cx="50%" // 圆心X轴位置
cy="50%" // 圆心Y轴位置
r="49.5%" //圆的半径
/>
</svg>

stroke-dasharray: 360%; //展示比例
stroke-dashoffset: 360%; //绘画比例

后续还需使用 Math.atan2 来时时计算倾斜度 来进行拖动画圆

1px-Bug

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/**
* 本文件主要放各种sass的function或者mixin,可以直接在.vue中的sass使用
*/

/**
* 主要是给border为0.5的时候使用的,当只有一条border或者border需要全部设置的画建议使用下面几个方法
*/
@mixin border-hack($color: #e7e7e7, $d1: none, $d2: none, $d3: none, $d4: none) {
position: relative;
&::after{
content: '';
transform: scale(0.5);
position: absolute;
left: -50%;
right: -50%;
top: -50%;
bottom: -50%;
@if($d1 == 'left' or $d2 == 'left' or $d3 == 'left' or $d4 == 'left'){
border-left: 1PX solid $color;
}
@if ($d1 == 'right' or $d2 == 'right' or $d3 == 'right' or $d4 == 'right') {
border-right: 1PX solid $color;
}
@if ($d1 == 'top' or $d2 == 'top' or $d3 == 'top' or $d4 == 'top') {
border-top: 1PX solid $color;
}
@if ($d1 == 'bottom' or $d2 == 'bottom' or $d3 == 'bottom' or $d4 == 'bottom') {
border-bottom: 1PX solid $color;
}
}
}

@mixin border-hack-top($color: #e7e7e7) {
@include border-hack($color, top);
}
@mixin border-hack-right($color: #e7e7e7) {
@include border-hack($color, right);
}
@mixin border-hack-bottom($color: #e7e7e7) {
@include border-hack($color, bottom);
}
@mixin border-hack-left($color: #e7e7e7) {
@include border-hack($color, left);
}
@mixin border-hack-all($color: #e7e7e7) {
@include border-hack($color, left, right, top, bottom);
}


1
2
3
4
5
6
.test{
width: 100%;
background: yellow;
color: white;
@include border-hack-all(red);
}

Vue2.x双向数据绑定原理

  • vue.js是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动的时候发布消息给订阅者,出发相应的监听回调。
  • 第一步:需要observe的数据对象进行递归遍历,包括子属性的对象属性,都加上setter和getter。这样的话,给这个对象的某个值复制,就会触发setter,这样就能监听到数据变化;
  • 第二步:compile解析模板指令,将模板中的变量替换成数据,然后初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,添加监听数据的订阅者,一旦数据有改变,收到通知,更新视图;
  • 第三步:Watcher订阅者是Observer和Compile之间通信的桥梁,主要做的事情是:
    • 1、在自身实例化是往属性订阅器(dep)里面添加自己
    • 2、自身必须有一个update()方法
    • 3、待属性变动dep.notice()通知时,能调用自身的update()方法,并触发Compile中绑定的回调,则功成身退
  • 第四步:MVVM作为数据绑定的入口,整合Observer、Compile和Watcher三者,通过Observer来监听自己的model数据变化,通过Complie来解析编译模板指令,最终利用Watcher搭起Observer和Compile之间的通信桥梁,达到数据变化->师徒更新;视图交互变化(input)->数据model变更的双向绑定效果。

vue中computed和watch的区别

计算属性computed:

  1. 支持缓存,只有依赖的数据发声改变,才会重新进行计算
  2. 不支持异步
  3. computed属性值会默认走缓存,计算属性是基于它们的响应式依赖进行缓存的
  4. 如果computed属性值是函数,那他默认会走get方法,函数的返回值就是属性的属性值;在computed中的,属性都有一个get和一个set方法,当数据变化时,调用set方法。

监听属性watch:

  1. 不支持缓存,数据变,直接回触发对应操作;
  2. watch支持异步;
  3. 监听的函数接收两个参数,第一个是新值,第二个是之前的值;
  4. 当一个属性发声变化时,会执行对应操作,一对多;
  5. 监听数据必须是data 声明的或者props 中的数据

JWT学习

JSON Web Token

缩写JWT 一种目前比较流行的跨域认证解决方案

JWT的原来

原理就是:服务器认证以后,生成一个JSON对象,发回给用户,如下

1
2
3
4
5
{
"姓名": "张三",
"角色": "管理员",
"到期时间": "2018年7月1日0点0分"
}

以后,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名。

服务器就不保存任何 session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。

Read More

electron基础

进程和线程

  • electron 和 chrome 是采用多进程的模式

好处是这样各个模块之间没有联系,一处崩溃不会影响其他地方

坏处就是会导致内存消耗比较大

主进程 - Main Process

  • 可以使用和系统对接的Electron API -创建菜单,上传文件 等等
  • 创建渲染进程 -Renderer Process
  • 全面支持 Node
  • 只有一个,作为整个程序的入口点

渲染进程 - Renderer Process

  • 可以有多个,每个对应一个窗口
  • 每个都是一个单独的进程
  • 全面支持 node 和 DOM API
  • 可以使用部分Electron提供的API

进程之间的通讯方式

  • Electron使用IPC在进程之间进行通讯
  • remote 渲染进程直接可以使用主进程API

JS与native交互方式

原生和H5 的交互方式

在 原生开发 Hybrid App 的时候,前端和原生通信,需要jsBridge进行交互,在此总结下和原生一些交互的方式

需要说明App内嵌的H5都是基于原生WebView来实现的,为h5展示提供了容器

JS && OC

ios的WebView有两种,分别 是UIWebView 、WKWebView

Read More