2016 рдореЗрдВ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдиреЗ рдирдИ рдКрдВрдЪрд╛рдЗрдпреЛрдВ рдкрд░ рд▓реЗ рдЬрд╛рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЗрд╕ рдкрд░ рдХрдИ рд▓реЛрдХрдкреНрд░рд┐рдп рддрдХрдиреАрдХреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдФрд░ рдореМрдЬреВрджрд╛ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдЗрд╕ рддрд░рд╣ рдХреА рд╡реИрд╢реНрд╡рд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдиреЗ рд╣рдЬрд╛рд░реЛрдВ рдХреЗ рдХреЛрдб рдЖрдзрд╛рд░ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╣рдЬрд╛рд░реЛрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░рддрд╛ рдЬреЛрдбрд╝реАред
рдХреНрдпреЛрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЖрдЬ рддрдХ, рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░рддрд┐рдпреЛрдЧрд┐рдпреЛрдВ рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рдЦрд┐рд▓рд╛рдл рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рд╣рд╛рд╡реА рд╣реИред рд░рд┐рдПрдХреНрдЯ рдХреЗ рдЖрд╕рдкрд╛рд╕, рджреБрдирд┐рдпрд╛ рдореЗрдВ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд╛ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд╕рдореБрджрд╛рдп рдмрдирд╛ рд╣реИред рдЗрд╕ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рд╣рд░ рддреАрд╕рд░рд╛ рдПрд╕рдкреАрдП рд▓рд┐рдЦрд╛ рд╣реБрдЖ рд╣реИред рд░рд┐рдПрдХреНрдЯ рдиреЗрдЯрд┐рд╡, рдЖрдИрдУрдПрд╕, рдпреВрдбрдмреНрд▓реНрдпреВрдкреА рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд░рд┐рдПрдХреНрдЯ.рдЬреЗрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрдИ рдмреЗрд╣рддрд░реАрди
рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рднреА рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, рдЖрдЬ рд╣рдо рдЙрди рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдЬреЛ рджреЛ рд╕реБрдкрд░ рд▓реЛрдХрдкреНрд░рд┐рдп рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХреАрдХрд░рдг рджреЗрддреА рд╣реИрдВ: рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд░рд┐рдПрдХреНрдЯред

рдЙрджрд╛рд╣рд░рдг
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо рд░рд┐рдПрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдЗрдП рд╕рд░рд▓ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝реЗрдВред
import * as React from 'react'; const HelloWorld: React.FunctionComponent<{ name: string; }> = ({ name = 'World' }) => { return <div>Hello, {props.name}</div>; }; export default HelloWorld;
рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХ рдпрд╛ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ React.FunctionComponent рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдкреНрд░реЙрдкрд░ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдлрд╝реАрд▓реНрдб рдЬреЛ рдШрдЯрдХ рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкреНрд░реЙрдкреНрд╕ рдореЗрдВ рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдирд╛рдо рдлрд╝реАрд▓реНрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рд╕рдм рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рд╡рд░реНрдЧ рдШрдЯрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
import * as React from 'react'; interface State { name: string; } interface Props {} class HelloWorld extends React.Component<Props, State> { state = { name: 'World' } setName(name: string) { this.setState({ name }); } redner() { return ( <React.Fragment> <hI>Hello, {this.state.name}</hI> <input value={this.state.name} onChange={(e) => this.setName(e.target.value)} /> </React.Fragment> ); } }
рдХрдХреНрд╖рд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рджреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдП: рдкреНрд░реЙрдкреНрд╕ рдФрд░ рд╕реНрдЯреЗрдЯред рдЙрдирдХреА рдорджрдж рд╕реЗ, рд╣рдордиреЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЙрдкреНрд╕ (рдЦрд╛рд▓реА) рдФрд░ рдШрдЯрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ - рдЬреИрд╕реЗ рдХрд┐ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдореЗрдВред
рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░реЙрдкреНрд╕ рдорд╛рди рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
import * as React from 'react'; interface Props { name?: string; } export default class HelloWorld extends React.Component<Props> { static defaultProps: Props = { name: 'World' }; render () { return <hI>Hello, {this.props.name}</hI>; } }
рд╡рд╣ рд╕рдм рд╣реИ! рд╣рдорд╛рд░рд╛ рдЫреЛрдЯрд╛ рд░рд┐рдПрдХреНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рдШрдЯрдХ рд░рд╛рдЬреНрдп рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕реНрддрд░ рдкрд░ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЖрдЗрдП рдЙрди рдлрд╛рдпрджреЛрдВ рдкрд░ рдирдЬрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдЬрд┐рдирд╕реЗ рд╣рдореЗрдВ рдпрд╣ рдорд┐рд▓рд╛:
- рд╕рдВрдХрд▓рди рдХреЗ рдЪрд░рдг рдореЗрдВ рд╣рдо рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдмреЗрдореЗрд▓ рджреЗрдЦреЗрдВрдЧреЗ;
- рдПрдХ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рдВрдкрд╛рджрдХ рд╣рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЪрд░рдгреЛрдВ рдореЗрдВ рдЧрд▓рддрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛, рдмрд╕ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдпрд╛ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд┐рд╕рдВрдЧрддрд┐рдпреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдХреЗ;
- рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рдкреНрд░рд▓реЗрдЦрдиред
рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ Enum
Enum рдПрдХ рдПрдиреНрдпреВрдорд░реЗрдЯреЗрдб рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИред рдпрджрд┐ рд╣рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рдЪрд░ рдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдпрд╛ рдЪрд░ рдХрд╛ рдорд╛рди рдХреЗрд╡рд▓ Enum рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред
import * as React from 'react'; enum Colors { RED, BLUE, GREEN } const ColorResult: React.FunctionComponent<{ color: Colors; }> = ({ color = Colors.Red }) => { return <div>Your color is {props.color}</div>; }; export default ColorResult;
рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХ рдореЗрдВ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЪрдпрдирд┐рдд рд░рдВрдЧ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред Enum Colors рдкреНрд░рдХрд╛рд░ рдореЗрдВ, рд╣рдордиреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд░рдВрдЧ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдШрдЯрдХ рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╣реАрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдмреЗрдореЗрд▓ рджреЗрдЦрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдПрдЧрд╛ред
рд╕рдЦреНрдд рд░реЗрдбрдХреНрд╕
2019 рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА Redux рдкрд░ рдХрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓ рд░рд╣реЗ рд╣реИрдВред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред
import * as React from 'react'; const initialState = { name: 'World' }; type HelloWorldStateProps = Readonly<typeof initialState>; interface Action { type: string; name?: string; } const worldNameReducer = ( state: HelloWorldStateProps = initialState, action: Action ): HelloWorldStateProps => { switch (action.type) { case "SET": return { name: action.name }; case "CLEAR": return { name: initialState.name }; default: return state; } }; const set = (name): Action => ({ type: "SET", name }); const clear = (): Action => ({ type: "CLEAR" }); const store = createStore( combineReducers({ world: worldNameReducer }) ); type StateProps = ReturnType<typeof mapStateToProps>; type DispatchProps = typeof mapDispatchToProps; interface AppProps extends StateProps, DispatchProps {} interface AppState extends StateProps {} class App extends React.Component<AppProps, AppState> { state = { name: initialState.name } setName(name: string) { this.setState({ name }); } render() { const { set, clear, name } = this.props; return ( <div> <hI>Hello, {name}</hI> <input value={this.state.name} onChange={(e) => this.setName(e.target.value)} /> <button onClick={() => set(this.state.name)}>Save Name</button> <button onClick={() => clear()}>Clear</button> </div> ); } } const mapStateToProps = ({ world }: { world: HelloWorldStateProps }) => ({ name: world.name, }); const mapDispatchToProps = { set, clear }; const AppContainer = connect( mapStateToProps, mapDispatchToProps )(App); render( <Provider store={store}> <AppContainer /> </Provider>, document.getElementById("root") );
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдХрдИ рд╕реНрддрд░реЛрдВ рдкрд░ рдПрдХ рдмрд╛рд░ рдЖрд╡реЗрджрди рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╕реНрд╡рдпрдВ reducers рд╣реИред рдЗрдирдкреБрдЯ рд░рд┐рдбреНрдпреВрд╕рд░ рдПрдХреНрд╢рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрд╕реЗ рд╣рдореЗрд╢рд╛ рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рд╡рд╛рдкрд╕ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ HelloWorldStateProps рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЖрдзреБрдирд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдХрд┐рддрдиреЗ рд░реЗрдбреНрдпреВрд╕рд░ рд╣реИрдВ, рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рдирд╡рд╛рдЪрд╛рд░ рд╣реИред рд╕рд╛рде рд╣реА, рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдХреА рдЧрдИ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рдПрдХ рд╕рдЦреНрдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИред
рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдЕрдЧрд▓рд╛ рд╕реНрддрд░ рдШрдЯрдХ рд╣реИред рдпрд╣рд╛рдВ рд╣рдордиреЗ AppProps рдФрд░ AppState рдХреЗ рдкреНрд░рдХрд╛рд░ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рд▓рд╛рдЧреВ рдХрд┐рдП рд╣реИрдВред рдЬрдм рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рддрд░рд╣ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рддреЛ рдЕрдзрд┐рдХ рдХреНрдпреЛрдВ рд▓рд┐рдЦреЗрдВ? рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдпрджрд┐ рдЖрдк рдХреБрдЫ рддрддреНрд╡реЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╕рднреА рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдВрдЧреЗред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рднрд╛рд╖рд╛ рд╣реИред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдлреНрд░рдВрдЯрдПрдВрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЕрднреНрдпрд╛рд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред