«Это первый день моего участия в Gengwen Challenge, пожалуйста, ознакомьтесь с подробностями мероприятия:Обновить вызов"
предисловие
При поиске работы я обнаружил, что некоторые компании используют React как стек технологий, и зарплата хорошая.Чтобы увеличить козырь выживания, мне все равно нужно изучить React и добавить навык выживания. Поскольку я разрабатываю проекты с Vue2.0 уже четыре года, я использую идеи разработки проектов с Vue2.0 для изучения React.
Интерфейсный проект состоит из страниц, для Vue страница состоит из нескольких компонентов, а сама страница также является компонентом маршрутизации. То же самое верно и для React. Vue предоставит серию технической поддержки для завершения разработки компонента.Вы можете начать с этой серии технической поддержки и перейти к React, чтобы найти соответствующую техническую поддержку для начала работы с React, например, как разработать пользовательский интерфейс компонентов в React, как использовать компоненты в React, как определить данные компонента в React и так далее.
Эта колонка поможет вам начать работу с React17 из Vue2.0 в соответствии с этим направлением мышления.
1. Леса
Прежде всего, вам нужно выбрать скаффолд для сборки проекта React.В React много скаффолдов.Почему в качестве скаффолда выбирают UmiJS?Нет, этот скаффолд похож на Vue Cli, по крайней мере конфигурация маршрутизации очень похожа на Vue Router.
Прежде чем учиться, создайте проект React с помощью UmiJS. Шаги очень просты:
- Сначала найдите место для создания пустого каталога, откройте инструмент командной строки и выполните команду
mkdir myapp && cd myapp
; - Выполнение заказа
npm create @umijs/umi-app
Создайте проект React; - Выполнение заказа
npm install
установить зависимости; - После успешной установки зависимостей выполните команду
npm run start
Запустите проект, откройте его в браузереhttp://localhost:8000Получите доступ к проекту.
Вы можете видеть, что структура каталогов проекта React myapp выглядит следующим образом:
.
├── package.json
├── .umirc.ts
├── .env
├── dist
├── mock
├── public
└── src
├── .umi
├── layouts/index.tsx
├── pages
├── index.less
└── index.tsx
└── app.ts
Откройте файл .umirc.ts со следующим содержимым
import { defineConfig } from 'umi';
export default defineConfig({
nodeModulesTransform: {
type: 'none',
},
routes: [
{ path: '/', component: '@/pages/index' },
],
fastRefresh: {},
});
Его маршрут находится вroutes
Конфигурация в параметрах очень похожа на конфигурацию Vue Router.Конкретная конфигурация будет представлена позже при переходе маршрутизации и передаче параметров.
следующий вsrc/pages/index.tsxФайл в письменном виде для изучения React.
2, Реагируйте, как разрабатывать компоненты пользовательского интерфейса
Все, что разработано в Vue и React, является компонентом, и его страница также является компонентом маршрутизации. Компоненты в Vue определяются с суффиксом как.vue
файл, в React компоненты определяются с суффиксом.js
В файле, если вы используете TypeScript для разработки React, его компоненты определены в суффиксе.tsx
в файле.
Как разработать часть пользовательского интерфейса компонента, например, разработать компонент HelloWorld для отображения на странице браузера.hello world, пользовательский интерфейс компонента состоит из частей HTML и частей CSS.
2.1 HTML-раздел
Для HTML-части компонента Vue рекомендует использовать шаблон шаблона, а React рекомендует использовать синтаксис JSX.
в инженерииsrc/pagesсоздать папкуHelloWorld.jsфайл, в котором разработан компонент HelloWorld.
Кроме того, существует два способа определения компонентов React: один — в форме функции, а другой — в форме класса ES6.
Функциональная форма, называемая функциональным компонентом:
export default function HelloWorld() {
return (
<div>hello world</div>
);
}
Форма класса ES6, называемая компонентом класса:
import React from 'react';
export default class HelloWorld extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<div>hello world</div>
);
}
}
Обратите внимание, что первая буква имени функции должна быть заглавной.. в функцииreturn
Пользовательский интерфейс компонента разрабатывается позже с использованием синтаксиса JSX.
Также обратите внимание, чтоreturn
Следующее содержимое следует использовать в самых крайних местах.()
сконден, иначе вreturn
За той же строкой следует хотя бы один<
может быть следующим:
export default function HelloWorld() {
return <
div>hello world</div>
}
Не выглядит ли это странно, поэтому лучше добавить()
.
2.2 Класс привязки и стиль
Что касается CSS-части сборки, самое главное - связать класс и стиль, вы можете добавлять стили в компонент HTML.
Первый взгляд на класс и стиль исправлен, React является обязательным.
export default function HelloWorld() {
return (
<div
className="title head"
style={{color:'red',fontSize:'16px'}}
>
hello world
</div>
);
}
Реагировать используетсяclassName
Чтобы связать класс, используйтеstyle
для привязки стиля. вstyle
Принятое значение является объектом и используется с{}
Квадратные скобки передаются, а имена свойств объектов могут быть названы только в camelCase.
Давайте посмотрим, как Class и Style являются переменными и как они связаны в React.
- Написание компонента класса:
import React from 'react';
export default class HelloWorld extends React.Component {
constructor(props) {
super(props);
this.state = {
styleData: { color: 'red', 'fontSize': "16px" },
isHead: true,
className: 'title'
};
}
render() {
return (
<div
className={`${this.state.className} ${this.state.isHead ? 'head' : ''}`}
style={this.state.styleData}
>
hello world
</div>
);
}
}
- Написание функциональных компонентов:
import { useState } from 'react';
export default function HelloWorld() {
const [styleData] = useState({ color: 'red', 'fontSize': "16px" });
const [isHead] = useState(true);
const [className] = useState('title');
return (
<div
className={`${className} ${isHead ? 'head' : ''}`}
style={styleData}
>
hello world
</div>
);
}
В React нужно использовать{}
присвоение переменной свойству иclassName
Принимаются только строки, а не массивы или объекты.Вы можете использовать строковую функцию шаблона ES6 для объединения переменных для создания строк.
Используется при написании функциональных компонентовuseState
Этот React Hook определяет некоторые переменные,useState
Роль будет описана позже.
3. Как использовать компоненты в React
Компонент HelloWorld написан, как его использовать? Давайте сначала рассмотрим, как использовать компоненты в Vue.Перед использованием компонентов вы должны зарегистрировать их, которые могут быть зарегистрированы как глобальные или локальные компоненты.
В React нет понятия регистрации компонентов, потому что компоненты — это вполне себе функция, только понятие внедрения компонентов, а понятия глобальных компонентов нет. необходимо использовать перед использованием компонентаimport
Сначала импортируйте компонент и назовите его.
import HelloWorld from './HelloWorld.js'
export default function Index(){
return (
<HelloWorld/>
)
}
Имена компонентов в React должны начинаться с заглавной буквы, потому что React рассматривает компоненты, начинающиеся со строчной буквы, как собственные теги DOM..
4. Как определить данные компонента в React
Из опыта разработки компонентов Vue данные компонента можно разделить на внутренние данные и данные параметров. То же самое верно и для React.В React внутренние данные называются состоянием, а данные параметров называются реквизитами.
4.1 Определение состояния внутренних данных
Процесс привязки переменных форм класса и стиля в React был определен выше.styleData
,isHead
,className
эти внутренние данные.
- в классе компонент находится в
this.state
Данные определены в этом объекте:
this.state = {
styleData: { color: 'red', 'fontSize': "16px" },
isHead: true,
className: 'title'
};
- Используется при написании функциональных компонентов
useState
Этот React Hook определяет данные:
const [styleData] = useState({ color: 'red', 'fontSize': "16px" });
const [isHead] = useState(true);
const [className] = useState('title');
Лично рекомендую использовать функциональную форму для разработки компонентов React, вы можете использовать React Hook, чтобы не изучать синтаксис класса в ES6, а также раздражатьthis
Укажите на проблему, тем самым уменьшив трудность входа.
О React Hook можно посмотретьздесь.
4.2 Определение свойств данных параметров
props используются для получения внешних данных, передаваемых компоненту. Например, определено в компоненте HelloWorldtitle
Данные параметра.
- Написание компонента класса:
import React from 'react';
class HelloWorld extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<div>{this.props.title}</div>
);
}
}
HelloWorld.defaultProps = {
title: 'hello world'
};
export default HelloWorld;
Конструктор в компоненте классаconstructor
приниматьprops
Поскольку сбор данных параметров передается в компонент, и вызовsuper(props)
Пучокprops
перейти кReact.Component
Конструктор, чтобы компоненты класса могли принимать набор данных параметровprops
, затем используйтеthis.props.title
читатьtitle
Значение данных параметра, в противном случае вы можете использоватьdefaultProps
определятьtitle
Значение по умолчанию для данных параметра.
- Написание функциональных компонентов:
import { useState } from 'react';
export default function HelloWorld(props) {
const {title = 'hello world'} = props;
return (
<div>{title}</div>
);
}
Функциональный компонент получаетprops
В качестве набора входящих данных параметров компонента функция деструктурирования и назначения ES6 используется для получения данных параметров компонента, и для данных параметров может быть установлено значение по умолчанию.
Обратите внимание здесь, который используется в шаблоне шаблона Vue{{}}
(двойные фигурные скобки) для использования данных, а в React он используется единообразно{}
(одиночные фигурные скобки) для использования данных.
Параметр data Props используется для получения данных, передаваемых компоненту извне, так как же передать данные компоненту в React?
5. Как передавать данные компонентам в React
В Vue указано, как динамические данные и статические данные строки, числа, логического значения, массива и типа объекта передаются компонентам Давайте узнаем, как передать это в React.
- Передавать динамические данные
import { useState } from 'react';
import HelloWorld from './HelloWorld.js';
export default function Index(){
const [styleData] = useState({ color: 'red', 'fontSize': "16px" });
const [isHead] = useState(true);
const [className] = useState('title');
return (
<HelloWorld
styleData={styleData}
isHead={isHead}
className={className}
/>
)
}
- Передать статические данные типа string
<HelloWorld title="hello vue"></HelloWorld>
- Передайте статические данные типа number
<HelloWorld num={1}></HelloWorld>
- Передать статические данные логического типа
<HelloWorld isHead={false}></HelloWorld>
- Передать статические данные типа массив
<HelloWorld className={['title','head']}></HelloWorld>
- Передать статические данные типа объекта
<HelloWorld styleData={{color:'red','fontSize':"16px"}}></HelloWorld>
Видно, что в React помимо передачи статических данных строкового типа необходимо использовать{}
Затем завернутые данные назначаются свойствам тега компонента для передачи данных компоненту.
6. Как слушать события DOM в React
6.1 Прослушивание событий DOM элементов DOM
- Написание компонента класса:
import React from 'react';
export default class HelloWorld extends React.Component {
constructor(props) {
super(props);
// 为了在回调中使用 `this`,这个绑定是必不可少的
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
console.log('点击事件');
}
render() {
return (
<div onClick={this.handleClick}>hello world</div>
);
}
}
- Написание функциональных компонентов:
export default function HelloWorld() {
const handleClick = ()=>{
console.log('点击事件');
}
return (
<div onClick={handleClick}>hello world</div>
);
}
Используется в реакцииonClick
Чтобы прослушивать события кликов, используйте{}
Оберните функцию, выполняемую при срабатывании события щелчка, а затем назначьте ееonClick
.
вonClick
синтетическое событие в Vue@
Затем следуют нативные события DOM, а в Reacton
За ними следуют события, которые не являются родными для DOM. Например, прослушивание событий двойного щелчка в Vue.@dblclick
, в то время как React прослушивает события двойного щелчкаonDoubleClick
.
Синтетические события в React можно увидеть в деталяхздесь.
6.2 Прослушивание событий DOM компонентов React
использовать во Вью.native
Модификатор для прослушивания событий DOM в компонентах, то есть как прослушивать события DOM в компонентах в React.
Например, чтобы отслеживать событие щелчка в компоненте, сначала передайте функцию, которая будет выполняться, когда событие щелчка инициируется как свойство компонента, прослушивайте событие щелчка в корневом элементе компонента и выполняйте свойство, когда событие щелчка запускается, чтобы косвенно отслеживать компонент в событии щелчка. Конкретная реализация выглядит следующим образом:
- Написание компонента класса:
import React from 'react';
export default class HelloWorld extends React.Component {
constructor(props:any) {
super(props);
console.log(this.props)
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.props.onClick();
}
render() {
return (
<div onClick={this.handleClick}>hello world</div>
);
}
}
import React from 'react';
import HelloWorld from './HelloWorld';
export default class Grandfather extends React.Component {
handleClick() {
console.log('点击事件');
}
render() {
return (
<HelloWorld onClick={() => { this.handleClick() }}>
</HelloWorld>
)
}
}
- Написание функциональных компонентов:
export default function HelloWorld(props) {
const { onClick } = props
const handleClick = () => {
onClick();
}
return (
<div onClick={handleClick}>hello world</div>
);
}
import HelloWorld from './HelloWorld';
export default function Index(){
const handleClick = ()=>{
console.log('点击事件');
}
return (
<HelloWorld onClick={() => { handleClick() }}>
</HelloWorld>
)
}
7. Как компоненты меняют данные в React
Как описано выше, данные компонентов React делятся на внутреннее состояние данных и свойства данных параметров, и соответствующие методы изменения также различаются.
7.1 Изменение состояния внутренних данных
Например, чтобы изменить внутренние данные, определенные в компонентеtitle
.
- Написание компонента класса:
import React from 'react';
export default class HelloWorld extends React.Component {
constructor(props) {
super(props);
this.state = {
title: 'hello world',
className: 'title'
};
// 为了在回调中使用 `this`,这个绑定是必不可少的
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.setState(state => ({
title: 'hello react',
className: 'title active'
}));
}
render() {
return (
<div
className={className}
onClick={this.handleClick}
>{title}</div>
);
}
}
существуетthis.setState()
Можно передать функцию или объект, рекомендуется передать функцию(state,props) =>{}
, функция может принимать внутреннее состояние данных и реквизиты данных параметров в качестве параметров, иstate
а такжеprops
Только чтение не может быть изменено, каждый вызовthis.setState
Состояние и реквизиты, прочитанные в то время, являются последними, особенно подходящими для нескольких вызовов.this.setState
Измените сцену того же состояния. Наконец, функция возвращает объект, содержимое которого является изменяемым состоянием.
- Написание функциональных компонентов:
import { useState } from 'react';
export default function HelloWorld() {
const [title,setTitle] = useState('hello world');
const [className,setClassName] = useState('title');
const handleClick = () =>{
setTitle('hello react');
setClassName('title active')
}
return (
<div
className={className}
onClick={handleClick}
>
{title}
</div>
);
}
Он сказал, что внутренние данные для состояния в React используютuseState(param)
При определении состояния вы можете передавать параметрыparam
Установите значение состояния по умолчанию, которое возвращает массив, первое значение массива — это состояние, а второе значение массива — это функция, которая изменяет состояние, которую можно вызвать для изменения состояния.
дополнительно использоватьuseState
Определенные данные являются адаптивными. Если страница использует данные, страница будет повторно отображаться после изменения данных.
7.2 Изменить свойства данных параметров
Как и в Vue, вы не можете напрямую изменять реквизиты в компонентах.Если вы хотите изменить реквизиты, вы можете изменить реквизиты только косвенно, изменив данные, передаваемые дочернему компоненту в родительском компоненте.Как разрешить родительскому компоненту изменяться в дочернем компоненте и передать его дочернему. Что касается данных компонентов, мы познакомим вас с тем, как взаимодействовать между родительским и дочерним компонентами в React.
8. Как общаться между родительными и дочерними компонентами в реакции
Описано на примере, если компонент HelloWorld "hello world" с параметром data propstitle
Как показано, он становится «hello React», когда нажимается кнопка изменения заголовка в компоненте.
- Написание компонента класса:
import React from 'react';
class HelloWorld extends React.Component {
constructor(props) {
super(props);
this.handleChangeTitle=this.handleChangeTitle.bind(this);
}
handleChangeTitle(){
this.props.changeTitle('hello React');
}
render() {
return (
<div>
{this.props.title}
<button
onClick={this.handleChangeTitle.bind(this)}>
改变标题
</button>
</div>
);
}
}
HelloWorld.defaultProps = {
title: 'hello world'
};
export default HelloWorld;
import HelloWorld from './HelloWorld.js'
import React from 'react'
class Index extends React.Component {
constructor(props) {
super(props);
this.state={
info:'hello world'
};
this.handleChangeTitle=this.handleChangeTitle.bind(this);
}
handleChangeTitle(data){
this.setState(state =>{
return {
info:data
}
})
}
render() {
return (
<HelloWorld
title={this.state.info}
changeTitle={this.handleChangeTitle}>
</HelloWorld>
);
}
}
export default Index;
- Написание функциональных компонентов:
export default function HelloWorld(props: any) {
const { title = 'hello world', changeTitle } = props;
const handleChangeTitle = () => {
changeTitle('hello React')
}
return (
<div>
{title}
<button onClick={handleChangeTitle}>改变标题</button>
</div>
);
}
import { useState } from 'react'
import HelloWorld from './HelloWorld.js'
export default function Index(){
const [info,setInfo] = useState('hello world');
const handleChangeTitle = (data)=>{
setInfo(data);
}
return (
<HelloWorld title={info} changeTitle={handleChangeTitle}/>
)
}
В родительском компоненте определитеinfo
данные, передаваемые дочерним компонентамtitle
данные параметра, а также определяет функцию обратного вызоваhandleChangeTitle
изменитьinfo
данные и передать функцию обратного вызова дочернему компонентуchangeTitle
данные параметра.
такие подкомпонентыchangeTitle
Данные параметра можно вызвать как функцию, вызвавchangeTitle
когда звонятhandleChangeTitle
Функция обратного вызова, значения могут быть изменены с помощьюdata
Параметры функции передаются, а затем выполняютсяsetInfo(data)
Изменятьinfo
данные, которые затем передаются дочернему компонентуtitle
данные параметра, косвенно измененныеtitle
Данные параметров, которые реализуют, как компоненты в React изменяют данные параметров.
Его также можно вызвать в родительском компонентеsetInfo
Изменения, переданные дочерним компонентамtitle
данные параметраinfo
Данные выше — это метод связи между родительским и дочерним компонентами в React.
9. Как отслеживать изменения данных компонента в React
В Vue вы можете просто использоватьwatch
Мониторить изменения данных в React сложнее, и методы реализации разные для разных типов подкомпонентов.
- Написание компонента класса:
использовать в компонентах классаcomponentDidUpdate
Этот метод жизненного цикла реализуется при первом отображении метода.componentDidUpdate
Не будет выполняться, будет срабатывать при последующих изменениях свойств и состояния.componentDidUpdate
, который принимает первый аргументprevProps
Представляет реквизит до изменения, второй параметрprevState
Представляет состояние до изменения.
componentDidUpdate(prevProps, prevState){
if(prevProps.title !== this.props.title){
console.log('props中的title数据改变了');
}
if(prevState.info !== this.state.info){
console.log('state中的info数据改变了');
}
}
- Написание функциональных компонентов
В функциональном компоненте вы можетеuseEffect
Этот React Hook прослушивает изменения данных, но он не может быть таким, как Vue.watch
Возможность получения старых данных перед изменениями. Итак, вам нужно настроить хук для реализации чего-то вроде Vue.watch
функция. Пользовательский хук — это функция, имя которой начинается с «использовать», и внутри функции могут быть вызваны другие хуки. Поэтому этот пользовательский хук называетсяuseWatch
.
Как получить старые данные перед изменением, это может сработать при первом изменении данныхuseWatch
Используйте контейнер для хранения старых данных и активируйте его в следующий разuseWatch
Старые данные перед изменением получаются путем чтения значения в контейнере чтения. Контейнер можно использоватьuseRef
Крючок создан.
useRef возвращает изменяемый объект ref, свойство .current которого инициализируется переданным параметром (initialValue). Возвращенный объект ref сохраняется на протяжении всего времени существования компонента.
import {useEffect,useRef} from 'react';
export function useWatch(value,callback){
const oldValue = useRef();
useEffect(() =>{
callback(value,oldValue.current);
oldValue.current=value;
},[value])
}
ноuseEffect
будет вызываться один раз после первого рендеринга компонента, в результате чегоcallback
Функция обратного вызова будет выполнена один раз, и в Vuewatch
используетсяimmediate
Конфигурация для управления выполнением сразу после первоначального рендеринга компонентаcallback
Функция обратного вызова и не будет выполняться по умолчанию после первого рендеринга компонента.callback
функция обратного вызова, затем вhook.jsопределитьuseWatch
.
Сначала поймите, что первый рендеринг компонента не выполняетсяcallback
Перезвоните.
import {useEffect,useRef} from 'react';
export function useWatch(value,callback){
const oldValue = useRef();
const isInit = useRef(false);
useEffect(() =>{
if(!isInit.current){
isInit.current = true;
}else{
callback(value,oldValue.current);
}
oldValue.current=value;
},[value])
}
добавить сноваimmediate
Конфигурация для управления выполнением сразу после первоначального рендеринга компонента.callback
Перезвоните.
import {useEffect,useRef} from 'react';
export function useWatch(value,callback,config={immediate: false}){
const oldValue = useRef();
const isInit = useRef(false);
useEffect(() =>{
if(!isInit.current){
isInit.current = true;
if(config.immediate){
callback(value,oldValue.current);
}
}else{
callback(value,oldValue.current);
}
oldValue.current=value;
},[value])
}
Дополнительноwatch
также возвращаетunwatch
функция, вызовunwatch
Функция может перестать прослушивать эти данные.
import { useEffect, useRef } from 'react';
export function useWatch(value, callback, config = { immediate: false }) {
const oldValue = useRef();
const isInit = useRef(false);
const isWatch = useRef(true);
useEffect(() => {
if (isWatch.current) {
if (!isInit.current) {
isInit.current = true;
if (config.immediate) {
callback(value, oldValue.current);
}
} else {
callback(value, oldValue.current);
}
oldValue.current = value;
}
}, [value])
const unwatch = () => {
isWatch.current = false;
};
return unwatch;
}
useWatch
После того, как этот хук определен, используйте его следующим образом.
export {useState} from 'react';
export {useWatch} from './hook.js';
export default function HelloWorld() {
const [title,setTitle] = useState('hello world')
useWatch(title, (value, oldValue) => {
console.log(value);
console.log(oldValue)
})
const handleChangeTitle = () => {
setTitle('hello React')
}
return (
<div onClick={handleChangeTitle}>{title}</div>
);
}
10. Как родительский компонент вызывает метод дочернего компонента в React
В Vue нужно использоватьref
Дайте подкомпоненту идентификационный идентификатор, а затем используйтеthis.$refs[ID]
Получите доступ к объекту экземпляра этого подкомпонента, а затем вызовите метод подкомпонента через объект экземпляра. В React это сложнее, и способы реализации разных типов подкомпонентов тоже разные.
- Написание подкомпонента класса:
import React from 'react';
export default class HelloWorld extends React.Component {
constructor(props) {
super(props);
this.state = {
title:'hello World'
};
}
handleChangeTitle(){
this.setState({
title:'hello React'
});
}
render() {
return (
<div>
{this.state.title}
</div>
);
}
}
import React from 'react';
import HelloWorld from './HelloWorld.js';
class Index extends React.Component {
constructor(props) {
super(props)
this.myCom = React.createRef();
this.changeTitle = this.changeTitle.bind(this);
}
changeTitle() {
this.myCom.current.handleChangeTitle();
}
render() {
return (
<div>
<HelloWorld ref={this.myCom} />
<button onClick={this.changeTitle}>改变标题</button>
</div>
)
}
}
export default Index;
- Написание функциональных компонентов:
useRef()
Нельзя использовать в функциональных компонентах, вы должны сначала использовать их в функциональных компонентах.useImperativeHandle
Примеры значений определены для воздействия на родительский элемент, входящий дополнительный компонент должен функционироватьforwardRef
После обработки потом выводят.
import { useState, forwardRef, useImperativeHandle } from 'react';
const HelloWorld = (props, ref) => {
const [title, setTitle] = useState('hello World');
useImperativeHandle(ref, () => ({
handleChangeTitle: () => {
setTitle('hello React')
},
}));
return (
<div>{title}</div>
);
}
export default forwardRef(HelloWorld)
import { useRef } from 'react'
import HelloWorld from './HelloWorld.js'
export default function Index() {
const myCom = useRef();
const changeTitle = () => {
myCom.current.handleChangeTitle();
}
return (
<div>
<HelloWorld ref={myCom} />
<button onClick={changeTitle}>改变标题</button>
</div>
)
}
11. Как реализовать слоты компонентов в React
11.1 Общие слоты
На самом деле в React нет понятия слотов, но его можно использоватьprops.children
реализовать функцию слота.
Каждый компонент может получить props.children. Он содержит содержимое между открывающим и закрывающим тегами компонента.
Например, чтобы разработать компонент HelloWorld для отображения «hello World», его также можно реализовать в виде слота черезprops.children
Передайте «hello World» из родительского компонента.
Написание компонента класса:
import React from 'react';
export default class HelloWorld extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<div>
{this.props.children}
</div>
);
}
}
import React from 'react';
import HelloWorld from './HelloWorld.js';
class Index extends React.Component{
constructor(props) {
super(props);
}
render() {
return (
<HelloWorld>hello World</HelloWorld>
)
}
}
export default Index;
Написание функциональных компонентов:
export default function HelloWorld(props){
const {children}=props;
return (
<div>
{children}
</div>
);
}
import HelloWorld from './HelloWorld.js';
export default function Index(){
return (
<HelloWorld>hello World</HelloWorld>
)
}
11.2 Именованные слоты
Вы можете передать функцию дочернему компоненту через реквизиты.Если функция наконец возвращает элемент React, элемент React написан в синтаксисе JSX, который косвенно реализует функцию именованных слотов.
Например, компонент HelloWorld разработан для отображения «hello World», который реализован в виде именованных слотов.
Написание компонента класса:
import React from 'react';
class HelloWorld extends React.Component{
constructor(props){
super(props)
this.elementSlot = "";
if (this.props.element) {
this.elementSlot = this.props.element();
}
}
render(){
return (
<div>
{this.elementSlot}
</div>
);
}
}
export default HelloWorld;
import React from 'react';
import HelloWorld from './HelloWorld.js';
class Index extends React.Component{
constructor(props) {
super(props);
}
info(){
return(
<span>hello World</span>
)
}
render() {
return (
<HelloWorld element={this.info}></HelloWorld>
)
}
}
export default Index;
Написание функциональных компонентов:
export default function HelloWorld(props) {
const { children, element } = props;
let elementSlot = "";
if (element) {
elementSlot = element();
}
return (
<div>
{elementSlot}
</div>
);
}
import HelloWorld from './HelloWorld.js';
export default function Index(){
const info = () =>{
return (
<span>hello World</span>
)
}
return (
<HelloWorld element={info}></HelloWorld>
)
}
11.3 Слоты с заданной областью действия
Роль слотов с ограниченной областью Vue заключается в записи содержимого слота в родительский компонент с данными в дочерний компонент.
Вспоминая процесс реализации слота имени маски выше, сначала определите функцию в родительском компоненте, функция может вернуть элемент React, затем передайте функцию дочернему компоненту через свойства, выполните функцию в дочернем компоненте и добавьте результат выполнения в элемент React дочернего компонента.
Если эта функция выполняется в дочернем компоненте, данные дочернего компонента передаются в качестве параметра, то функция может использоваться в родительском компоненте для получения данных дочернего компонента для записи элемента React (содержимое слот). Это реализует слоты с ограниченной областью действия.
Например, разработайте компонент HelloWorld для отображения «запись именованного слота hello World с данными подкомпонента», который реализован в виде слотов с заданной областью действия.
Написание компонента класса:
import React from 'react';
class HelloWorld extends React.Component{
constructor(props){
super(props)
this.state = {
info:'用子组件的数据写具名插槽 hello World'
}
this.elementSlot = "";
if (this.props.element) {
this.elementSlot = this.props.element(this.state.info);
}
}
render(){
return (
<div>
{this.elementSlot}
</div>
);
}
}
export default HelloWorld;
import React from 'react';
import HelloWorld from './HelloWorld.js';
class Index extends React.Component{
constructor(props) {
super(props);
}
info(data){
return(
<span>{data}</span>
)
}
render() {
return (
<HelloWorld element={this.info}>
</HelloWorld>
)
}
}
export default Index;
Написание функциональных компонентов
import { useState } from "react";
export default function HelloWorld(props) {
const { children, element } = props;
const [info] = useState('用子组件的数据写具名插槽 hello World')
let elementSlot = "";
if (element) {
elementSlot = element(info);
}
return (
<div>
{elementSlot}
{children}
</div>
);
}
import HelloWorld from './HelloWorld.js';
export default function Index(){
const info = (data) =>{
return (
<span>{data}</span>
)
}
return (
<HelloWorld element={info}></HelloWorld>
)
}
резюме
Вышеизложенное относится к технологии, которую Vue будет использовать для разработки компонента, и с точки зрения поиска соответствующего решения для реализации в React, чтобы начать работу с React.После прочтения вы сможете разработать несколько простых страниц с помощью React и иметь возможность делить страницу на компоненты и данные взаимодействия между компонентами. В следующей статье будет рассказано о разработке компонентовКак эти часто используемые директивы в Vue реализованы в React.