vscode调试与log
1.准备工作
点击调试
选择运行环境 (chrome 或者是 node)
注意:配置json文件时,端口号要和项目端口号一致,
否则无法运行调试
2.开始调试
断点调试:
点击代码左侧的列就可以出现红色的断点,执行时会在这里停住,
同时也可以在左侧看到调用栈和函数名,非常适合用来调试源码。
添加记录点:
记录点的作用相当于console.log, 变量需要用 {} 包裹,
代码运行就会打印出对应的值,同时在代码里也不用写很多console,省去了后面还要再次删掉的麻烦。
React–Query使用(v5)
当依赖项为undefined、null、’’ 时(视为无效参数),不发起请求
function Todos() {
const [filter, setFilter] = React.useState('')
const { data } = useQuery({
queryKey: ['todos', filter],
queryFn: () => fetchTodos(filter),
enabled: !!filter
})
...
..
.
}
React 有状态函数组件 依然是纯函数
见Meat(FaceBook工程师 黄玄 回答)
https://www.zhihu.com/question/537538929
??
value1 ?? value2
?? 在value1和value2之间,只有当value1为null或者 undefined 时取value2,否则取value1(0,false,""被认为是有意义的,所以还
是取value1)
typescript 类型断言
as
let student = {}
student.name = 'jack'
student.age = 18
interface Person{
name:string;
age: number
}
let student = {} as Person
student.name = 'jack'
student.age = 18
<>
function getLength(something: string | number): number {
return (<string>something).length;
}
let a: any
let b = <string>a
注意: <>断言在react组件中与jsx语法冲突!,一般不可用。
!(非空断言)
let num:number | null | undefined
let num2 = num!.toFixed(2)
双重断言
<span>{console.log("render") as unknown as string}</span>
超时报错、未超时正常返回数据
模拟请求数据的方法
function queryfn() {
return new Promise(function (reslove) {
setTimeout(function () {
console.log("1111");
reslove(true);
}, 5000);
});
}
type one
function isTimeOut(queryfn, delaty = 4000) {
new Promise(function (reslove, reject) {
setTimeout(function () {
reject(new Error("request timeout!"));
}, delaty);
console.log("111");
queryfn().then((res) => {
console.log("res----->", res);
reslove(res);
});
});
}
type two
const timeoutReject = (p1, timeout = 3000) => {
const p2 = new Promise((resolve, reject) => {
setTimeout(() => {
reject("网络超时");
}, timeout);
});
return Promise.race([p1, p2]);
};
timeoutReject(queryfn())
.then((res) => {
console.log("result", res);
})
.catch((err) => {
console.log("error", err);
});
若请求前的先决条件不满足,多次调用直到满足
function isOK() {
return false;
}
function getData() {
return "data";
}
function simplePoller(queryfn, callback) {
let time = 1000;
const poll = () => {
console.log("time", time);
if (queryfn()) {
callback();
return;
}
setTimeout(poll, time);
time *= 1.5
};
setTimeout(poll, time);
}
console.log("deepQuery", simplePoller(isOK, getData));
请求出错,重试次数
function likeData() {
return new Promise(function (reslove, reject) {
setTimeout(() => {
reslove("jieguo");
}, 5000);
});
}
type one
function retryFunc(likeData, trymax) {
let num = 0;
function autopoll(reslove) {
num++;
if (num > trymax) {
return;
}
likeData()
.then((res) => {
console.log("res", res);
reslove(res);
})
.catch((err) => {
console.log("eerrr", err);
setTimeout(autopoll, 5000);
});
}
return new Promise(function (reslove, reject) {
autopoll(reslove);
});
}
type two
function retryTwo(likeData, max) {
let num = 0;
function poll() {
return likeData()
.then((res) => {
return res;
})
.catch((err) => {
num++;
console.log("eeeeeeee", err);
if (num < max) {
setTimeout(function () {
poll();
}, 2000);
} else {
throw new Error(`已经连续请求${num}次`);
}
});
}
return poll();
}
jsx不能console?
<span>{console.log("render")}</span>
不能将类型“void”分配给类型“ReactNode”。ts(2322)
index.d.ts(1376, 9): 所需类型来自属性 "children",在此处的 "DetailedHTMLProps, HTMLSpanElement>" 类型上声明该属性
解决
<span>{console.log("render") as unknown as string}</span>
使用回调函数接收异步数据
function getData() {
return new Promise(function(reslove, reject){
reslove(
[
{
name: '巨diao',
age: 28
},
{
name: '牛恒',
age: 25
},
]
)
})
}
async function test(callback){
const res = await getData();
console.log('res', res);
callback(res)
}
function demo(value) {
console.log('value', value);
}
test(demo)