在实习过程中遇到的一些问题。
npm相关问题
[1] npm命令无反应
解决方案:删除 C:\Users\ [账号] \ .npmrc 文件
[2] npm install 过程中出现 cb() never called或unexpected end of line
解决方案:输入以下命令1
2
3npm cache clean -f
npm install -g angular-cli
npm install --no-package-lock
这个问题困扰了我整整一天,因为mentor和我用的是相同的node(v8.11.3)和npm版本(v5.6.0),但是他那边就可以install而我不可以,我将npm升级降级到各种版本都不可以。查阅了大量资料后才发现一个可用的解决方案。
Typescript相关问题
[1] Typescript React Starter
非常方便快速的启动Typescript+Reaact项目的教程:https://github.com/Microsoft/TypeScript-React-Starter#typescript-react-starter
[2] 创建Array方法1
2let list = new Array // 不指定类型
let list = Array<T>() //指定类型,并初始化list为空
[3] 泛型
举例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15function sortByName<T extends { name: string }>(array: T[]): T[] {
array.sort((d1: T, d2: T) => {
if (d1.name.localeCompare) {
return d1.name.localeCompare(d2.name);
} else {
if (d1.name < d2.name) {
return -1;
} else if (d1.name > d2.name) {
return 1;
}
return 0;
}
});
return array;
}
[4] Object.assign({}, props, {a: b}
js中使用Object.assign({}, props, {a: b}
ts可以直接改为{ ...props, a: b }
React相关问题
[1] 获得表单输入
对于<input type='text' ref='myInput'>
,可以通过this.refs.myInput.value
获得文本框的值。但是在实际操作过程中有可能会遇到浏览器报错,内容为:Property ‘value’ does not exist on type ‘Element’,这是由于缺少类型断言造成的。
解决方案:1
2let input = this.refs.myInput as HTMLDivElement
console.log(input.value)
这对于其他类型的表单组件(如select)也适用。
[2] Promise.resolve()
创建一个空Promise,适用于方法f返回值可能为Promise | undefines,
例如:1
2
3((f && f()) || Promise.resolve()).then(() => {
…
}
CSS相关问题
[1] 当div子元素均为width: auto时,display: inline-block会失效
解决方案:如果不想给这个div设置固定的width,可以将这个div设置为width: max-content
。
为了不影响其他(如text-align: right
)等样式,可以添加min-width: 100%
。
——
但是max-content
在Edge中不支持:
子节点使用display: table-cell
。
[2] >
> 表示只对第一个子节点生效
[3] 比较好看的shadow样式
text-shadow: 0 0 0.125rem #ffffff;
box-shadow: inset 0 -1px #ebebeb;
[4] 在css中引入新字体
引入:1
2
3
4
5
6@font-face {
font-family: “72”;
src: url(...);
font-weight: 400;
font-style: normal
}
使用:font-family: “72”, ...;
[5] 改变svg颜色
一般的颜色可以使用fill,如:fill: green;
使用https://codepen.io/sosuke/pen/Pjoqqp 可以将任意HEX颜色code转化为filter,例如#00EE00
可转化为:filter: invert(42%) sepia(93%) saturate(1352%) hue-rotate(87deg) brightness(119%) contrast(119%);
Jquery与原生js转换
[1] Jquery: $(…)
原生js:document.querySelectorAll(…)
[2] Jquery:hasClass
原生js:1
2
3
4
5
6
7
8
9
10function hasClass(obj: any, cls: string) {
const obj_class = obj.className;
const obj_class_lst = obj_class.split(/\s+/);
for (const x in obj_class_lst) {
if (obj_class_lst[x] === cls) {
return true;
}
}
return false;
}
[3] Jquery::contains
如 $('.title:contains("Delete")'
原生js:1
2
3
4
5
6function contains(selector: any, text: string) {
const elements = document.querySelectorAll(selector);
return [].filter.call(elements, function (element: any) {
return RegExp(text).test(element.textContent);
});
}
如contains('.title', "Delete")[0]
[4] Jquery:.text()
原生js:.innerHTML.replace(/<.*?>/g, "")
[5] Jquery:.parent()
原生js:.parentNode
[6] Jquery:.find('…')
原生js:.querySelectorAll('…')[0]
其他问题
[1] 将下载的代码部署到本地服务器上
解决方案:1
2npm i lite-server -g
lite-server
[2] chrome检查中断点失效
可能是因为断点打在了错误的chunk。
解决方案:可以通过在本地文件中加debugger;
语句,来判断正确的chunk。
[3] 编写测试用例,创建假的节点1
2
3let oFakeChildContainer = document.createElement("div");
let oFakeParentContainer = document.createElement("div");
oFakeParentContainer.appendChild(oFakeChildContainer);
[4]Drag and drop测试1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17const dragSource = document.querySelectorAll(…)[0];
const dropTarget = document.querySelectorAll(…)[0];
expect(dragSource.getAttribute('draggable')).toBeTruthy();
const createBubbledEvent = (type: string, props = {}) => {
const event = new Event(type, { bubbles: true });
Object.assign(event, props);
return event;
};
dragSource.dispatchEvent(
createBubbledEvent("dragstart", { clientX: 0, clientY: 0 })
);
dropTarget.dispatchEvent(
createBubbledEvent("drop", { clientX: 0, clientY: 1 })
);
expect(…);
done();
[5] scrollIntoView
… .scrollIntoView({ behavior: “smooth”, block: “nearest” });
参数:behavior,block,inline
[6] 异步方法的使用1
2
3
4const handler = async () => {
await f();
…
};
参考资料
[1] https://stackoverflow.com/questions/15393821/npm-err-cb-never-called
[2] https://github.com/Microsoft/TypeScript/issues/10453
[3] https://medium.freecodecamp.org/how-to-write-better-tests-for-drag-and-drop-operations-in-the-browser-f9a131f0b281
[4] https://stackoverflow.com/questions/22252472/change-svg-color