Библиотека JavaScript для создания пользовательских интерфейсов.
декларативный
React позволяет безболезненно создавать интерактивные пользовательские интерфейсы. стиль простые представления для каждого состояния в вашем приложении, а React может оперативно обновлять и отображать просто правильные части как только ваши знания изменятся.
Декларативные представления создают ваш код много надежных и их легче исправлять.
Компонентный
Создавайте инкапсулированные компоненты, которые управляют своим состоянием, а затем компонуйте их для создания расширенных пользовательских интерфейсов.
Поскольку логика компонентов написана на JavaScript а не в шаблонах, вы сможете просто передать получать информацию через ваше приложение и сохранять состояние вне DOM.
Узнай один раз, пиши где угодно
Мы не делаем предположений об остальном стеке ваших технологий, поэтому вы можете разрабатывать новые функции в React, не переписывая существующий код.
React также может отображать на сервере с помощью Node и запускать мобильные приложения с помощью React Native.
Простой компонент
Компоненты React имеют метод render(), который принимает входные данные и возвращает то, что должно отображаться. В этом примере используется XML-подобный синтаксис, известный как JSX. Это позволяет render() получать доступ к входным данным, переданным в компонент. реквизит.
React не требует использования JSX. Чтобы увидеть необработанный код JavaScript, сгенерированный на этапе компиляции JSX, используйте REPL Babel.
Пример кода
class HelloMessage extends React.Component { render() { return <div>Hello {this.props.name}</div>; } } root.render(<HelloMessage name="Taylor" />);
Вывод
Hello Taylor
Компонент с состоянием
Компонент может хранить данные внутреннего состояния в дополнение к входным данным (через this.props) (доступ через this.state). Когда данные о состоянии компонента изменяются, визуализированная разметка обновляется путем повторного вызова render().
Пример кода
class Timer extends React.Component { constructor(props) { super(props); this.state = { seconds: 0 }; } tick() { this.setState(state => ({ seconds: state.seconds + 1 })); } componentDidMount() { this.interval = setInterval(() => this.tick(), 1000); } componentWillUnmount() { clearInterval(this.interval); } render() { return ( <div> Seconds: {this.state.seconds} </div> ); } } root.render(<Timer />);
Приложение
Мы можем создать простое приложение Todo, используя свойства и состояние. В этом примере состояние используется для отслеживания текущего списка элементов, а также текста, введенного пользователем. Несмотря на то, что обработчики событий отображаются встроенными, они будут собраны и реализованы с использованием делегирования событий.
Пример кода
class TodoApp extends React.Component { constructor(props) { super(props); this.state = { items: [], text: '' }; this.handleChange = this.handleChange.bind(this); this.handleSubmit = this.handleSubmit.bind(this); } render() { return ( <div> <h3>TODO</h3> <TodoList items={this.state.items} /> <form onSubmit={this.handleSubmit}> <label htmlFor="new-todo"> What needs to be done? </label> <input id="new-todo" onChange={this.handleChange} value={this.state.text} /> <button> Add #{this.state.items.length + 1} </button> </form> </div> ); } handleChange(e) { this.setState({ text: e.target.value }); } handleSubmit(e) { e.preventDefault(); if (this.state.text.length === 0) { return; } const newItem = { text: this.state.text, id: Date.now() }; this.setState(state => ({ items: state.items.concat(newItem), text: '' })); } } class TodoList extends React.Component { render() { return ( <ul> {this.props.items.map(item => ( <li key={item.id}>{item.text}</li> ))} </ul> ); } } root.render(<TodoApp />);
Компонент, использующий внешние плагины
Вы можете использовать React для взаимодействия с другими библиотеками и фреймворками. В этом примере используется замечательная внешняя библиотека Markdown для преобразования значения ‹textarea› в реальном времени.
Пример кода
class MarkdownEditor extends React.Component { constructor(props) { super(props); this.md = new Remarkable(); this.handleChange = this.handleChange.bind(this); this.state = { value: 'Hello, **world**!' }; } handleChange(e) { this.setState({ value: e.target.value }); } getRawMarkup() { return { __html: this.md.render(this.state.value) }; } render() { return ( <div className="MarkdownEditor"> <h3>Input</h3> <label htmlFor="markdown-content"> Enter some markdown </label> <textarea id="markdown-content" onChange={this.handleChange} defaultValue={this.state.value} /> <h3>Output</h3> <div className="content" dangerouslySetInnerHTML={this.getRawMarkup()} /> </div> ); } } root.render(<MarkdownEditor />);