可選鏈操做符是一個新的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, }, } 複製代碼
愉快的使用?.操做符。