React中的ref
React中ref还是很常用的,它使父组件具备操作子组件/原生DOM的能力,比如控制一个modal组件弹窗显示等等。但使用上有时会遇到一个不注意的坑,这里梳理下。
ref挂载元素成功后,并不会触发组件重新渲染
有时会将useEffect依赖中增加ref或者ref.current,但实际上当ref中引用的组件被挂载后,ref.current虽然已经保存了实例引用,但组件并不会触发重新渲染,更别说effect重新执行了,因此遇到此类需求需要修改方案来解决,方法如下
ref的使用,可以直接ref对象赋值,也可以callback,两种方式本身作用是一致的,唯一区别是如果想在挂载时执行一些动作,可以使用callback,举个🌰
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
32function App() {
const pElRef = useRef<any>();
const [refresh, setRefresh] = useState(0);
useEffect(() => {
console.log('render?');
}, [refresh]);
const onAttached = useCallback((ref) => {
if (refresh === 0) {
setRefresh(refresh + 1);
}
pElRef.current = ref;
}, [refresh]);
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo"/>
<p ref={onAttached}>
Edit <code>src/App.tsx</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
);
}
如上,增加state参refresh,在挂载成功时修改从而做到重新渲染。
HOC下的ref传递
使用组件时有几个参数是特殊的,比如key,又或者是ref。它们并非属于props,react下会进行特殊处理,比如在HOC下,就需要注意。
关闭恼人的微信网址拦截
在微信中打开一些网页时总会出现以下拦截提醒,遇到这种情况时必须点击
继续访问
。技术人不忍这种流氓事,于是着手从技术上解决这个体验问题。
Tampermonkey浏览器插件
首先想到的是这个方案,解决步骤如下
Chrome浏览器下安装插件Tampermonkey(油猴)
插件中增加如下脚本,该脚本我已已经开源,不想了解具体实现的直接安装即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23// ==UserScript==
// @name Redirect URL
// @namespace https://1991421.cn
// @version 0.1
// @description 解决恼人的网页拦截,比如微信打开链接
// @author Alan He
// @match https://weixin110.qq.com/cgi-bin/mmspamsupport-bin/newredirectconfirmcgi*
// @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant none
// @run-at document-end
// ==/UserScript==
(function() {
'use strict';
function htmlDecode(input) {
var doc = new DOMParser().parseFromString(input, 'text/html');
return doc.documentElement.textContent;
}
if(window.location.href.match(/^https:\/\/weixin110.qq.com\/cgi-bin\/mmspamsupport-bin\/newredirectconfirmcgi/)){
window.location.href=htmlDecode(cgiData.url);
}
})();
如上操作后,当访问拦截被拦截,也会快速跳转到目标网页。
组件库文档搭建-Storybook
群晖Chrome下载插件只支持HTTPS
最近
NAS Download Manager (for Synology)
插件更新后发现只支持HTTPS地址,但是我的NAS下载服务目前仅支持HTTP,因此考虑在客户端解决该问题。
解决方案- whistle
whistle可以代理HTTPS请求,自行签发证书,因此可以解决。
配置whistle及Chrome插件,确保可以拦截请求
步骤如下,具体可查看whistle官方文档
- whistle开启HTTPS
- rootCA证书安装且信任
- 安装插件比如SwitchyOmega,解决Chrome走whistle代理
增加并开启rule,解决HTTPS到HTTP的转换,使whistle代理后,最终还是发起http请求
1
2# NAS服务链接
/https(://110.100.176.222:50098.+)/ http$1
如上配置后,将地址贴到下载插件下,即可正常联通使用。