可选链操做符是一个新的js api,它容许读取一个被链接对象的深层次的属性的值而无需明确校验链条上每个引用的有效性。目前处于Stage 3提案阶段,暂时不能够直接使用,能够经过babel编译器使用。javascript
obj?.prop
obj?.[expr]
func?.(args)
复制代码
好比,咱们有一个对象obj,如今要访问它的深层属性baz。java
const obj = { foo: { bar: { baz: 42, fun: ()=>{} }, }, }; // 不使用?. let baz = obj && obj.foo && obj.foo.bar && obj.foo.bar.baz; // 使用?. let baz = obj?.foo?.bar?.baz; // 结果:42 复制代码
函数调用和表达式react
// 函数调用 obj.fn?.() // 表达式 obj?.['prop' + 'Name] 复制代码
咱们能够经过babel编译器来使用能够链操做符。git
yarn add @babel/plugin-proposal-optional-chaining --dev
复制代码
添加.babelrc文件github
{ "plugins": ["@babel/plugin-proposal-optional-chaining"] } 复制代码
默认状况下create-react-app,不容许修改babel配置,这里咱们须要安装两个附加模块以容许补充默认配置。json
yarn add customize-cra react-app-rewired --dev
复制代码
添加config-overrides.js文件api
const { useBabelRc, override } = require('customize-cra'); module.exports = override(useBabelRc()); 复制代码
修改package.jsonbash
"scripts": { "start": "react-app-rewired start", "build": "react-app-rewired build", "test": "react-app-rewired test --env=jsdom" } 复制代码
安装babel编译器后,就能够使用?.操做符了。可是若是你使用eslint的话,你就须要安装babel-eslint来识别这种新语法。babel
yarn add babel-eslint --dev
复制代码
添加.eslintrc文件markdown
{ "parser": "babel-eslint", "rules": { "strict": 0 } } 复制代码
vscode的js验证器目前并不能识别?.操做符,因此会有错误警告:
解决错误警告:
安装vscode扩展ESLint,在扩展商店搜素并安装ESLint。
修改vscode配置(.vscode/settings.json):
{ "eslint.alwaysShowStatus": true, "eslint.autoFixOnSave": true, "javascript.validate.enable": false, // 主要是这个,关闭vscode的js验证器 "[javascript]": { "editor.formatOnSave": false, }, "[javascriptreact]": { "editor.formatOnSave": false, }, } 复制代码
愉快的使用?.操做符。