рд░рд┐рдПрдХреНрдЯ 16.18 рд░рд┐рдПрдХреНрд╢рди рд╣реБрдХ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдкрд╣рд▓реА рд╕реНрдерд┐рд░ рд░рд┐рд▓реАрдЬрд╝ рд╣реИред рдЕрдм рдЖрдк рдмрд┐рдирд╛ рдХрд┐рд╕реА рдбрд░ рдХреЗ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдкреАрдЖрдИ рдирд╛рдЯрдХреАрдп рд░реВрдк рд╕реЗ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред рдпрджреНрдпрдкрд┐ react
рд╡рд┐рдХрд╛рд╕ react
рдХреЗрд╡рд▓ рдирдП рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдирдИ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддреА рд╣реИ, рдХрдИ, рдЦреБрдж рд╕рд╣рд┐рдд, рдкреБрд░рд╛рдиреЗ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдореИрдиреБрдЕрд▓ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдПрдХ рд╢реНрд░рдорд╕рд╛рдзреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ, рд╣рдо рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рддрдХрдиреАрдХреЗрдВ рди рдХреЗрд╡рд▓ react
рдШрдЯрдХреЛрдВ, рдмрд▓реНрдХрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп JavaScript
рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИрдВред
рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ
рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдкрд░рд┐рдЪрдп рд▓реЗрдЦ рд╡рд┐рд╡рд░рдг рд╣реБрдХ рдХреНрдпрд╛ рд╣реИрдВ рдФрд░ рд╡реЗ рдХреНрдпрд╛ рд╕рд╛рде рдЦрд╛рддреЗ рд╣реИрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ state
рдореБрдХреНрдд рдШрдЯрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рдкрд╛рдЧрд▓ рддрдХрдиреАрдХ рд╣реИред
button.js
рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред button.js
рдлрд╛рдЗрд▓:
import React, {Component} from 'react'; export default Button; class Button extends Component { constructor() { super(); this.state = { enabled: true }; this.toogle = this._toggle.bind(this); } _toggle() { this.setState({ enabled: false, }); } render() { const {enabled} = this.state; return ( <button enabled={enabled} onClick={this.toggle} /> ); } }
рд╣реБрдХ рдХреЗ рд╕рд╛рде, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
import React, {useState} from 'react'; export default Button; function Button(props) { const [enabled, setEnabled] = useState(true); function toggle() { setEnabled(false); } return ( <button enabled={enabled} onClick={toggle} /> ); }
рдЖрдк рд▓рдВрдмреЗ рд╕рдордп рддрдХ рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рддрдХрдиреАрдХ рд╕реЗ рдЕрдкрд░рд┐рдЪрд┐рдд рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рдд рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ: рдХреЛрдб рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдХрд╕реНрдЯрдо рд╣реБрдХ рдХреЗ рджрд┐рд▓рдЪрд╕реНрдк рд╕реЗрдЯ usehooks.com рдФрд░ streamich.imtqy.com рдкрд░ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдЧрд▓рд╛, рд╣рдо рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдорддрднреЗрджреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рд░реВрдкрд╛рдВрддрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рд╕рдВрдХреЗрддрди рдХреЗ рдЗрд╕ рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рдЧреАрддрд╛рддреНрдордХ рд╡рд┐рд╖рдпрд╛рдВрддрд░: рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЧреИрд░-рдорд╛рдирдХ рдЙрдкрдпреЛрдЧ
ES2015
рдиреЗ рджреБрдирд┐рдпрд╛ рдХреЛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдкреБрдирд░реНрдЧрдарди рдХреЗ рд░реВрдк рдореЗрдВ рдРрд╕реА рдЕрджреНрднреБрдд рдЪреАрдЬ рджреАред рдФрд░ рдЕрдм, рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп:
const letters = ['a', 'b']; const first = letters[0]; const second = letters[1];
рд╣рдо рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рддрддреНрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
const letters = ['a', 'b']; const [first, second] = letters;
рдРрд╕рд╛ рд░рд┐рдХреЙрд░реНрдб рди рдХреЗрд╡рд▓ рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИ, рдмрд▓реНрдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдХрдо рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддрддреНрд╡ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: рдЪрд░ рдХрд╛ рдкреНрд░рд╛рд░рдВрднред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдЗрд╕ es2015
рдЖрддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рдпрд╣ es2015
рд▓рд┐рдП рдирд╣реАрдВ es2015
рдЯреАрдо рд░рд╛рдЬреНрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдРрд╕реЗ рдЕрд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖрдПрдЧреАред
рдЕрдЧрд▓рд╛, рдореИрдВ рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬреЛ рдПрдХ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЛ
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣реБрдХ рдХреА рдШреЛрд╖рдгрд╛ рд╕реЗ рдЫрд╣ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдерд╛ рдХрд┐ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХреЗрд╡рд▓ рд╕рд░рдгреА рд╕реЗ рд╕рдЬрд╛рддреАрдп рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рддреНрд░реБрдЯрд┐ рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдиреЛрдб рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдХреЗ рд╕рд╛рдеред js. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯреНрд░рд╛рдЗ try-catch
рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп:
let data; let error; try { data = JSON.parse('xxxx'); } catch (e) { error = e; }
рдЬреЛ рдмрд╣реБрдд рдмреЛрдЭрд┐рд▓ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдХрдо рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдордиреЗ рдЪрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдмрдирд╛рдИ рдереАред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдЯреНрд░рд╛рдЗ-рдХреИрдЪ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреА рдЬрд╝рд░реВрд░рдд рдХреА рд╣рд░ рдЪреАрдЬрд╝ рдХрд░реЗрдЧрд╛, рдЬреЛ рд╣рдореЗрдВ рдКрдкрд░ рд╕реВрдЪреАрдмрджреНрдз рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрд╛рдПрдЧрд╛:
const [error, data] = tryCatch(JSON.parse, 'xxxx');
рдЗрд╕ рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХреЗ рд╕реЗ, рд╣рдордиреЗ рд╕рднреА рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рдирд┐рд░реНрдорд╛рдгреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓рд┐рдпрд╛, рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдЫреЛрдбрд╝рдХрд░ред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╛рдпрджреЗ рд╣реИрдВ:
- рдХрд┐рд╕реА рднреА рдЪрд░ рдирд╛рдо рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ (рдЬрдм рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╡рд┐рдирд╛рд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдпрд╛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЗрд╕рдХреА рдЕрдкрдиреА рдмреЛрдЭрд┐рд▓ рдХреАрдордд рд╣реЛрдЧреА);
- рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛ рдмрджрд▓рддреА рдирд╣реАрдВ рд╣реИ;
- рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕, рдЬреЛ рд╕рдм рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рдЧрд╛рдпрдм рд╣реИ;
рдФрд░, рдлрд┐рд░ рд╕реЗ, рдпрд╣ рд╕рдм рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рдирд╛рд╢ рдХреЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд┐рдирд╛, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рд▓рдЧреЗрдЧрд╛:
const result = tryCatch(JSON.parse, 'xxxx'); const error = result[0]; const data = result[1];
рдпрд╣ рдЕрднреА рднреА рдорд╛рдиреНрдп рдХреЛрдб рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рдХрдо рд╣реИред рдореИрдВ рдЯреНрд░рд╛рдИ-рдХреИрдЪ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рднреА рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рдХрд┐ async-await
рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде рд╣реИ async-await
try-catch
рдирд┐рд░реНрдорд╛рдг рдЕрднреА рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
const [error, data] = await tryToCatch(readFile, path, 'utf8');
рдпрджрд┐ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдХреЗ рдРрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдореЗрд░реЗ рдкрд╛рд╕ рдЖрдпрд╛, рддреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдХреЛ рднреА рдХреНрдпреЛрдВ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬрд┐рд╕рдореЗрдВ 2 рд░рд┐рдЯрд░реНрди рдорд╛рди рд╣реИрдВ: рдПрдХ рд╣рд╛рд╕реНрдХрд▓ рдЯреНрдпреВрдкрд▓ред
рдЗрд╕ рдкрд░ рдЧреЗрдп рд╡рд┐рд╖рдпрд╛рдВрддрд░ рдкреВрд░рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдореБрджреНрджреЗ рдкрд░ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддрд╛ рд╣реИред
рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛
рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреБрдЯрдЖрдЙрдЯ рдПрдПрд╕рдЯреА рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╡рд╣реА рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдФрд░ @ рдкреБрдЯрдЖрдЙрдЯ / рдкреНрд▓рдЧрдЗрди-рд░рд┐рдПрдХреНрд╢рди-рд╣реБрдХ рдкреНрд▓рдЧ ред
react-hooks
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Component
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдХрдХреНрд╖рд╛ рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрджрдо рдЙрдард╛рдиреЗ рд╣реЛрдВрдЧреЗ:
bind
рдирд┐рдХрд╛рд▓рдирд╛- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдЬреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВ ("_" рдирд┐рдХрд╛рд▓реЗрдВ);
- рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
this.state
рдмрджрд▓ this.state
- рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
this.setState
рдмрджрд▓ this.setState
this
рд╣рд░ рдЬрдЧрд╣ рд╕реЗ рд╣рдЯрд╛ рджреЗрдВ- рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
class
рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ - рдЖрдпрд╛рдд рдореЗрдВ
Component
рдмрдЬрд╛рдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рд╕рдВрдмрдВрдз
@putout/plugin-react-hooks
рд╕рд╛рде putout
рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
npm i putout @putout/plugin-react-hooks -D
рдЕрдЧрд▓рд╛, .putout.json
рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:
{ "plugins": [ "react-hooks" ] }
рдлрд┐рд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ putout
рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рд╕реНрдкрд╛рдпрд▓рд░ рд╣реИрдбрд░ coderaiser@cloudcmd:~/example$ putout button.js /home/coderaiser/putout/packages/plugin-react-hooks/button.js 11:8 error bind should not be used react-hooks/remove-bind 14:4 error name of method "_toggle" should not start from under score react-hooks/rename-method-under-score 7:8 error hooks should be used instead of this.state react-hooks/convert-state-to-hooks 15:8 error hooks should be used instead of this.setState react-hooks/convert-state-to-hooks 21:14 error hooks should be used instead of this.state react-hooks/convert-state-to-hooks 7:8 error should be used "state" instead of "this.state" react-hooks/remove-this 11:8 error should be used "toogle" instead of "this.toogle" react-hooks/remove-this 11:22 error should be used "_toggle" instead of "this._toggle" react-hooks/remove-this 15:8 error should be used "setState" instead of "this.setState" react-hooks/remove-this 21:26 error should be used "state" instead of "this.state" react-hooks/remove-this 26:25 error should be used "setEnabled" instead of "this.setEnabled" react-hooks/remove-this 3:0 error class Button should be a function react-hooks/convert-class-to-function 12 errors in 1 files fixable with the `--fix` option
putout
12 рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:
putout --fix button.js
рдЕрдм button.js
рджрд┐рдЦрддрд╛ рд╣реИ:
import React, {useState} from 'react'; export default Button; function Button(props) { const [enabled, setEnabled] = useState(true); function toggle() { setEnabled(false); } return ( <button enabled={enabled} onClick={setEnabled} /> ); }
рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЖрдЗрдП рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрдИ рдирд┐рдпрдореЛрдВ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
this
рд╣рд░ рдЬрдЧрд╣ рд╕реЗ рд╣рдЯрд╛ рджреЗрдВ
рдЪреВрдБрдХрд┐ рд╣рдо рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рдкреНрд░рдкрддреНрд░ рдХреЗ рд╕рднреА рднрд╛рд╡ред setEnabled
рдХреЛ setEnabled
рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо ThisExpression рдХреЗ рдиреЛрдбреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдПрдВрдЧреЗ , рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, MemberExpression рдХреЗ рд╕рдВрдмрдВрдз рдХреЗ рдмрдЪреНрдЪреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ object
рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВ:
{ "type": "MemberExpression", "object": { "type": "ThisExpression", }, "property": { "type": "Identifier", "name": "setEnabled" } }
рдирд┐рд╖реНрдХрд╛рд╕рди -рдЗрд╕ рдирд┐рдпрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХреЛрдб рдореЗрдВ, рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдлрд╝рдВрдХреНрд╢рди traverseClass
рдХрдХреНрд╖рд╛ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП traverseClass
рд╣реИ, рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╕рдордЭ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдЗрд╕реЗ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЕрдзрд┐рдХ рд╕рдЯреАрдХрддрд╛ рдХреЗ рд▓рд┐рдП:
рд╕реНрдкрд╛рдпрд▓рд░ рд╣реИрдбрд░ рдкрд░реАрдХреНрд╖рдг, рдмрджрд▓реЗ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
const test = require('@putout/test')(__dirname, { 'remove-this': require('.'), }); test('plugin-react-hooks: remove-this: report', (t) => { t.report('this', `should be used "submit" instead of "this.submit"`); t.end(); }); test('plugin-react-hooks: remove-this: transform', (t) => { const from = ` class Hello extends Component { render() { return ( <button onClick={this.setEnabled}/> ); } } `; const to = ` class Hello extends Component { render() { return <button onClick={setEnabled}/>; } } `; t.transformCode(from, to); t.end(); });
рдЖрдпрд╛рдд рдореЗрдВ, useState
рдмрдЬрд╛рдп useState
рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рд░реВрдкрд╛рдВрддрд░рд┐рдд-рдЖрдпрд╛рдд-рдШрдЯрдХ-рд╕реЗ-рдЙрдкрдпреЛрдЧ-рд░рд╛рдЬреНрдп рдирд┐рдпрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП:
import React, {Component} from 'react'
рдкрд░
import React, {useState} from 'react'
рдЖрдкрдХреЛ ImportDeclaration рдиреЛрдб рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
{ "type": "ImportDeclaration", "specifiers": [{ "type": "ImportDefaultSpecifier", "local": { "type": "Identifier", "name": "React" } }, { "type": "ImportSpecifier", "imported": { "type": "Identifier", "name": "Component" }, "local": { "type": "Identifier", "name": "Component" } }], "source": { "type": "StringLiteral", "value": "react" } }
рд╣рдореЗрдВ source.value = react
рд╕рд╛рде source.value = react
рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ name = Component
рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде ImportSpecifier
рдЦреЛрдЬ рдореЗрдВ specifiers
рд╕рд░рдгреА рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЬрд╛рдПрдВ:
рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкрд░реАрдХреНрд╖рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
const test = require('@putout/test')(__dirname, { 'convert-import-component-to-use-state': require('.'), }); test('plugin-react-hooks: convert-import-component-to-use-state: report', (t) => { t.report('component', 'useState should be used instead of Component'); t.end(); }); test('plugin-react-hooks: convert-import-component-to-use-state: transform', (t) => { t.transformCode(`import {Component} from 'react'`, `import {useState} from 'react'`); t.end(); });
рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрдИ рдирд┐рдпрдореЛрдВ рдХреЗ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЬрд╛рдВрдЪ рдХреА, рдмрд╛рдХреА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдПрдХ рд╕рдорд╛рди рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдк рдмрдЯрди рдХреЗ рдкреЗрдбрд╝ рдХреЗ рд╕рднреА рдиреЛрдбреНрд╕ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред astxplorer рдореЗрдВ рдкрд╛рд░реНрд╕ рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ред рд╡рд░реНрдгрд┐рдд рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЖрдЬ рд╣рдордиреЗ рд╣реБрдХ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реАрдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рджреЗрдЦрд╛ред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, @putout/plugin-react-hooks
рдХреЗрд╡рд▓ рдмреБрдирд┐рдпрд╛рджреА рддрдВрддреНрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдореБрджрд╛рдп рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рдФрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕рдореЗрдВ рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ, рд╡рд┐рдЪрд╛рд░реЛрдВ, рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдФрд░ рд╕рд╛рде рд╣реА рд▓рд╛рдкрддрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред