Props

Последнее обновление: 01.04.2022

Props представляет коллекцию значений, которые ассоциированы с компонентом. Эти значения позволяют создавать динамические компоненты, которые не зависят от жестко закодированных статических данных.

Функциональный подход:

function Hello(props) {
  return <div>
			<p>Имя: {props.name}</p>
			<p>Возраст: {props.age}</p>
	</div>;
}

Параметр props, который передается в функцию компонента, инкапсулирует свойства объекта. В частности, свойство name и age. При рендеринге мы можем создать набор компонентов Hello, но передать в них разные данные для name и age. И таким образом, получим набор однотипной разметки html, наполненной разными данными.

Использование классов:

class Hello extends React.Component {
  render() {
    return <div>
			<p>Имя: {this.props.name}</p>
			<p>Возраст: {this.props.age}</p>
	</div>;
  }
}

Класс компонента также извне получает объект свойств, который доступен через this.props.

Использование стрелочных функций (arrow functions):

const Hello = (props) => {
	
	const {name, age} = props;
    return(<div>
            <p>Имя: {name}</p>
            <p>Возраст: {age}</p>
           </div>);
}

Используем компонент Hello:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>METANIT.COM</title>
</head>
<body>
    <div id="app"></div>
       
    <script crossorigin src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
    <script type="text/babel">
      function Hello(props) {
          return <div>
              <p>Имя: {props.name}</p>
              <p>Возраст: {props.age}</p>
          </div>;
        }
       ReactDOM.createRoot(
            document.getElementById("app")
        )
        .render(
            <Hello name="Tom" age="33" />
        );
    </script>
</body>
</html>

При рендеринге React передает значения атрибутов в виде единого объекта "props". То есть значение из атрибута name="Tom" перейдет в свойство props.name.

В итоге будет создана следующая страница:

Свойства Props в React

Значения по умолчанию

Мы можем определить для свойств значения по умолчанию на тот случай, если их значения не передаются извне.

Если мы применяем классы, то для установки значений применяется статическое свойство defaultProps:

class Hello extends React.Component {
			
	render() {
		return <div>
			<p>Имя: {this.props.name}</p>
			<p>Возраст: {this.props.age}</p>
		</div>;
	}
}
Hello.defaultProps = {name: "Tom", age: 22};

При функциональном определении компонента также применяется свойство defaultProps:

function Hello(props) {
	return <div>
		<p>Имя: {props.name}</p>
		<p>Возраст: {props.age}</p>
	</div>;
}
Hello.defaultProps = {name: "Tom", age: 22};

И в любом из этих случаев, если мы не определим какие-то свойства для компонента, то они будут брать значения из значений по умолчанию:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>METANIT.COM</title>
</head>
<body>
    <div id="app"></div>
       
    <script crossorigin src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
    <script type="text/babel">
        function Hello(props) {
            return <div>
                <p>Имя: {props.name}</p>
                <p>Возраст: {props.age}</p>
            </div>;
        }
        Hello.defaultProps = {name: "Tom", age: 22};
        ReactDOM.createRoot(
            document.getElementById("app")
        )
        .render(
            <Hello name="Bob" />
        );
    </script>
</body>
</html>
Свойства по умолчанию Props defaultProps в компонентах React

Обновление props

Сам this.props представляет неизменяемый объект, который предназначен только для чтения. Поэтому не следует его изменять, например:

class Hello extends React.Component {
	render() {
		this.props.name = "Tom";
		return <h1>Привет, {this.props.name}</h1>;
	}
}

Если же надо время то времени изменять какие-то внутренние данные компонента, то для хранения таких данных в React предназначен объект state, который будет рассмотрен в следующей статье.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850