Идея CGI заключается в том, что программа / сценарий (независимо от того, Perl или даже C) получает вход через STDIN (данные запроса) и выводит данные через STDOUT (echo, printf statements). Причина, по которой большинство скриптов php не квалифицируется, заключается в том, что они выполняются в модуле PHP Apache.
Реквизиты и состояние связаны. Состояние одного компонента часто становится опорой дочернего компонента. Реквизиты передаются дочернему элементу в методе рендеринга родителя как второй аргумент React.createElement()
или, если вы используете JSX, более знакомые атрибуты тегов.
<MyChild name={this.state.childsName} />
Значение состояния родителя из childsName
становится дочерним this.props.name
ребенка. С точки зрения ребенка, имя prop неизменно. Если это нужно изменить, родитель должен просто изменить свое внутреннее состояние:
this.setState({ childsName: 'New name' });
и React будет распространять его на ребенка для вас. Естественный следующий вопрос: что, если ребенку нужно изменить свое имя? Обычно это делается через дочерние события и родительские обратные вызовы. Ребенок может выставить событие, называемое, например, onNameChanged
. Затем родитель будет подписаться на событие, передав обработчик обратного вызова.
<MyChild name={this.state.childsName} onNameChanged={this.handleName} />
Ребенок передаст свое запрошенное новое имя в качестве аргумента для обратного вызова события, вызвав, например, this.props.onNameChanged('New name')
, и parent будет использовать имя в обработчике события для обновления своего состояния.
handleName: function(newName) {
this.setState({ childsName: newName });
}
В общем случае состояние одного компонента (родителя) является опорным для дочернего компонента.
class Parent extends React.Component {
constructor() {
super();
this.state = {
name : "John",
}
}
render() {
return (
<Child name={this.state.name}>
)
}
}
class Child extends React.Component {
constructor() {
super();
}
render() {
return(
{this.props.name}
)
}
}
В приведенном выше коде у нас есть родительский класс (родительский), который имеет имя как его состояние, которое передается дочернему компоненту (класс Child) в качестве опоры и дочернего компонент отображает его с помощью {this.props.name}
- это специальное изменяемое свойство, которое содержит данные Компонента. он имеет значение по умолчанию при установке компонентов.
реквизит - это особое свойство, неизменное по своей природе и используемое в случае прохождения по значению от родителя к ребенку. реквизиты - это всего лишь канал связи между Компонентами, всегда движущийся от вершины (родительский) к buttom (дочерний).
ниже - полный пример объединения состояния & amp; реквизит: -
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>state&props example</title>
<script src="https://unpkg.com/react@0.14.8/dist/react.min.js"></script>
<script src="https://unpkg.com/react-dom@0.14.8/dist/react-dom.min.js"></script>
<script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
var TodoList = React.createClass({
render(){
return <div className='tacos-list'>
{
this.props.list.map( ( todo, index ) => {
return <p key={ `taco-${ index }` }>{ todo }</p>;
})}
</div>;
}
});
var Todo = React.createClass({
getInitialState(){
return {
list : [ 'Banana', 'Apple', 'Beans' ]
}
},
handleReverse(){
this.setState({list : this.state.list.reverse()});
},
render(){
return <div className='parent-component'>
<h3 onClick={this.handleReverse}>List of todo:</h3>
<TodoList list={ this.state.list } />
</div>;
}
});
ReactDOM.render(
<Todo/>,
document.getElementById('root')
);
</script>
</body>
</html>
Опоры просто сокращают свойства. Опоры - это то, как компоненты общаются друг с другом. Если вы вообще знакомы с React, вы должны знать, что реквизит протекает вниз от родительского компонента.
Также существует случай, когда вы можете иметь реквизиты по умолчанию, чтобы реквизиты были установлены, даже если родительский компонент не пропускает реквизит вниз.
Вот почему люди ссылаются на React как на однонаправленный поток данных. Это немного касается вашей головы, и я, вероятно, буду писать об этом позже, но на данный момент просто помню: данные передаются от родителя к ребенку. Опоры неизменны (фантастическое слово, чтобы оно не менялось)
Итак, мы счастливы. Компоненты получают данные от родителя. Все отсортировано, правда?
Ну, не совсем. Что происходит, когда компонент получает данные от кого-то другого, кроме родителя? Что делать, если пользователь вводит данные непосредственно в компонент?
Ну, вот почему у нас есть состояние.
STATE
Опоры не должны меняться, поэтому состояние поднимается вверх. Обычно компоненты не имеют состояния и поэтому называются апатридами. Компонент, использующий состояние, известен как stateful. Не стесняйтесь бросать этот маленький лакомый кусочек на вечеринках и смотреть, как люди уходят от вас.
Таким образом, состояние используется, чтобы компонент мог отслеживать информацию между любыми рендерами, которые он делает. Когда вы устанавливаетеState, он обновляет объект состояния, а затем повторно отображает компонент. Это супер круто, потому что это означает, что «Реакт» заботится о тяжелой работе и невероятно быстро.
. В качестве небольшого примера состояния, вот фрагмент из строки поиска (стоит проверить этот курс, если вы хотите чтобы узнать больше о React)
Class SearchBar extends Component {
constructor(props) {
super(props);
this.state = { term: '' };
}
render() {
return (
<div className="search-bar">
<input
value={this.state.term}
onChange={event => this.onInputChange(event.target.value)} />
</div>
);
}
onInputChange(term) {
this.setState({term});
this.props.onSearchTermChange(term);
}
}
РЕЗЮМЕ
Реквизиты и государство выполняют похожие вещи, но используются по-разному. Большинство ваших компонентов, вероятно, будут апатридом.
Опоры используются для передачи данных от родителя к ребенку или самому компоненту. Они неизменяемы и, следовательно, не будут изменены.
Состояние используется для изменяемых данных или данных, которые будут меняться. Это особенно полезно для ввода пользователем. Например, подумайте о барах поиска. Пользователь будет вводить данные, и это обновит то, что они видят.
реквизиты (short для «properties») и состояние - это обычные объекты JavaScript. Хотя оба содержат информацию, которая влияет на вывод рендера, они различаются одним важным способом: реквизит передается компоненту (аналогично параметрам функции), тогда как состояние управляется внутри компонента (подобно переменным, объявленным внутри функции).
blockquote>Таким образом, просто состояние ограничено вашим текущим компонентом, но реквизит может быть передан любому компоненту, который вы хотите ... Вы можете передать состояние текущего компонента в качестве поддержки другим компонентам ...
Также в React у нас есть компоненты без состояния, у которых есть только реквизит, а не внутреннее состояние ...
Пример ниже показывает, как они работают в вашем приложении:
Родитель ( state-full component):
class SuperClock extends React.Component { constructor(props) { super(props); this.state = {name: "Alireza", date: new Date().toLocaleTimeString()}; } render() { return ( <div> <Clock name={this.state.name} date={this.state.date} /> </div> ); } }
Ребенок (компонент без учета состояния):
const Clock = ({name}, {date}) => ( <div> <h1>{`Hi ${name}`}.</h1> <h2>{`It is ${date}`}.</h2> </div> );
Реквизит vs state summary Мне нравится лучше всего здесь: https://github.com/uberVU/react-guide/blob/master/props-vs-state.md Большая подсказка для шляпы эти ребята. Ниже приведен отредактированный вариант этой страницы:
tl; dr Если компоненту необходимо изменить один из его атрибутов в какой-то момент времени, этот атрибут должен быть частью его состояния, иначе он должен быть просто опорой для этого Компонента.
Опоры (short для свойств) являются конфигурацией компонента. Они получены сверху и неизменны, если речь идет о Компоненте, принимающем их. Компонент не может изменить свои реквизиты, но он отвечает за объединение реквизитов своих дочерних Компонентов.
Состояние - это структура данных, которая начинается со значения по умолчанию, когда компонент монтируется в качестве реквизита. , Он может быть изменен во времени, главным образом в результате пользовательских событий.
Компонент управляет своим собственным внутренним состоянием. Помимо установки начального состояния, у него нет бизнеса, играющего с состоянием его детей. Вы можете концептуализировать состояние как личное для этого компонента.
props state Can get initial value from parent Component? Yes Yes Can be changed by parent Component? Yes No Can set default values inside Component?* Yes Yes Can change inside Component? No Yes Can set initial value for child Components? Yes Yes Can change in child Components? Yes No
Состояние является необязательным. Поскольку состояние увеличивает сложность и снижает предсказуемость, предпочтительным является компонент без состояния. Несмотря на то, что вы явно не можете обойтись без состояния в интерактивном приложении, вам следует избегать слишком большого количества компонентов состояния.
Безстоящий компонент Только реквизиты, состояние отсутствует. С функцией render () не так много происходит. Их логика вращается вокруг реквизита, который они получают. Это делает их очень легкими для наблюдения и проверки.
Компонент состояния. Оба реквизита и состояние. Они используются, когда ваш компонент должен сохранять определенное состояние. Это хорошее место для взаимодействия клиент-сервер (XHR, веб-сокеты и т. Д.), Обработки данных и реагирования на пользовательские события. Такие логистики должны быть инкапсулированы в умеренное количество компонентов Stateful, в то время как вся логика визуализации и форматирования должна перемещаться вниз по потоку во многие компоненты без учета состояния.
Состояние - это способ реагирования на информацию, содержащуюся в вашем компоненте.
Предположим, что у вас есть компонент, который должен получать некоторые данные с сервера. Обычно вы хотите проинформировать пользователя, если запрос обрабатывается, если он потерпел неудачу и т. Д. Это часть информации, которая подходит только для этого конкретного компонента. Это - то, где государство входит в игру.
Обычно лучший способ определить состояние выглядит следующим образом:
class MyComponent extends React.Component {
constructor() {
super();
this.state = { key1: value1, key2: value2 }
}
}
, но в реализациях latests реагировать native вы можете просто сделать:
class MyComponent extends React.Component {
state = { key1: value1, key2: value2 }
}
Эти два примера выполняются точно так же, это просто улучшение синтаксиса.
Итак, что отличается от того, как просто использовать атрибуты объектов, как мы всегда имеем в программировании OO? Обычно информация, хранящаяся в вашем состоянии, не должна быть статичной, она со временем изменится, и вам необходимо будет обновить View, чтобы отразить эти изменения. Государство предлагает эту функцию простым способом.
State IS MEANT TO IN INTUTABLE! и я не могу сделать этого достаточно. Что это значит? Это означает, что вы НИКОГДА не должны делать что-то вроде этого.
state.key2 = newValue;
Правильный способ сделать это:
this.setState({ key2: newValue });
Использование this.setState ваш компонент запускается через цикл обновления и если какая-либо часть состояния изменится, ваш метод визуализации Component будет вызван снова, чтобы отразить это изменение.
Проверьте реакционные документы для еще более расширенного объяснения: https: //facebook.github .io / реагируют / документы / состояние и-lifecycle.html
Это моя текущая точка зрения относительно объяснения между состоянием и реквизитом
Для связи между родителем и ребенком просто передайте реквизиты.
Используйте состояние для хранения данных, которые ваша текущая страница нуждается в вашем представлении контроллера.
Использовать опоры для передачи данных и amp; обработчиков событий до ваших дочерних компонентов.
Эти списки должны помочь вам при работе с данными в ваших компонентах.
Props
Состояние
Для связи между двумя компонентами, не имеющими отношения родитель-потомок, вы можете настроить свою собственную глобальную систему событий. Подпишитесь на события в componentDidMount (), отмените подписку в компонентеWillUnmount () и вызовите setState (), когда вы получаете событие. Паттерн потока является одним из возможных способов его организации. - https://facebook.github.io/react/tips/communicate-between-components.html
Какие компоненты должны иметь состояние?
Большинство ваших компонентов следует просто взять некоторые данные из реквизита и сделать его. Однако иногда вам приходится отвечать на ввод пользователя, запрос сервера или время. Для этого вы используете состояние.
Постарайтесь сохранить как можно больше ваших компонентов без гражданства. Делая это, вы изолируете состояние до его наиболее логичного места и минимизируете избыточность, что упрощает рассуждение о вашем приложении.
Общим примером является создание нескольких компонентов без состояния, которые просто отображают данные, и компонент состояния выше их в иерархии, которая передает свое состояние своим детям через реквизит. Компонент с состоянием инкапсулирует всю логику взаимодействия, в то время как компоненты без состояния сохраняют декларативный способ отображения данных. - https://facebook.github.io/react/docs/interactivity-and-dynamic-uis.html#what-components-should-have-state
Что должно Перейти в состояние?
Состояние должно содержать данные, которые обработчики событий компонента могут изменить для запуска обновления пользовательского интерфейса. В реальных приложениях эти данные имеют тенденцию быть очень маленькими и JSON-сериализуемыми. При создании компонента с состоянием, подумайте о минимально возможном представлении его состояния и сохраните только те свойства в этом состоянии. Внутри render () просто вычислите любую другую информацию, которая вам нужна, основываясь на этом состоянии. Вы обнаружите, что думать и писать приложения таким образом, как правило, приводит к наиболее правильному приложению, поскольку добавление избыточных или вычисленных значений в состояние означает, что вам необходимо явно синхронизировать их, а не полагаться на React, вычисляя их для вас. - https://facebook.github.io/react/docs/interactivity-and-dynamic-uis.html#what-should-go-in-state
В ответ на исходный вопрос о неизменяемости реквизита они называются неизменяемыми в отношении дочернего компонента , но могут быть изменены в родительском.
Большинство ответов путают Beginners, скорее уточняя. Очень сложно общаться и понимать. Вы можете понять это, связав его с Plain JS.
Простыми словами,
Состояние ссылается на локальное состояние компонента, к которому нельзя получить доступ и изменить вне компонента и только могут быть использованы & amp; модифицированный внутри компонента.
Обычная JS
const DummyFunction = () => { let name = 'Manoj'; console.log(`Hey ${name}`) }
Реакция JS Эквивалент
class DummyComponent extends React.Component { state = { name: 'Manoj' } render() { return <div>Hello {this.state.name}</div>; }
Опоры на с другой стороны, сделать компоненты повторно используемыми, предоставив компонентам возможность получать данные из родительского компонента в виде реквизита.
Plain JS
const DummyFunction = (name) => { console.log(`Hey ${name}`) } DummyFunction('Manoj'); DummyFunction('Ajay');
React JS
class DummyComponent extends React.Component { render() { return <div>Hello {this.props.name}</div>; } } // when using the component <DummyComponent name="Manoj" /> <DummyComponent name="Ajay" />
Кредиты: https://medium.com/@manojsinghnegi
Статья Linke: https://medium.com/@manojsinghnegi/react- состояние VS-реквизита-объяснены-51beebd73b21
В основном разница состоит в том, что состояние является чем-то вроде атрибутов в ООП: это нечто локальное для класса (компонента), используемого для лучшего описания. Реквизиты похожи на параметры - они передаются компоненту из вызывающего компонента (родителя): как если бы вы вызывали функцию с определенными параметрами.
В основном, реквизиты и состояние - это два способа, которыми компонент может знать, что и как визуализировать. Какая часть состояния приложения принадлежит государству и которая принадлежит некоторому магазину верхнего уровня, больше связана с дизайном вашего приложения, чем с тем, как работает React. Самый простой способ решения - ИМО - подумать, полезен ли этот конкретный фрагмент для приложения в целом или какая-то локальная информация. Кроме того, важно не дублировать состояние, поэтому, если какой-либо фрагмент данных можно вычислить из реквизита - он должен рассчитываться из реквизита.
Например, предположим, что у вас есть элемент управления выпадающим списком (который включает стандартный HTML-выбор для пользовательского стиля), который может: a) выбрать какое-либо значение из списка и b) открыть или закрыть (т. е. список опций, отображаемый или скрытый). Теперь предположим, что ваше приложение отображает список элементов определенного типа и ваш фильтр выпадающего списка для записей списка. Тогда было бы лучше передать значение активного фильтра в качестве опоры и сохранить открытое / закрытое состояние локально. Кроме того, чтобы сделать его функциональным, вы должны передать обработчик onChange из родительского компонента, который будет вызываться внутри элемента выпадающего списка и немедленно отправить обновленную информацию (новый выбранный фильтр) в магазин. С другой стороны, открытое / закрытое состояние может храниться внутри выпадающего компонента, потому что остальная часть приложения действительно не заботится о том, открыт ли элемент управления, пока пользователь не изменит его значение.
Следующий код не полностью работает, ему нужны css и обработка выпадающего списка щелчков / размытие / изменение событий, но я хотел бы сохранить пример минимальным. Надеюсь, что это поможет понять разницу.
const _store = {
items: [
{ id: 1, label: 'One' },
{ id: 2, label: 'Two' },
{ id: 3, label: 'Three', new: true },
{ id: 4, label: 'Four', new: true },
{ id: 5, label: 'Five', important: true },
{ id: 6, label: 'Six' },
{ id: 7, label: 'Seven', important: true },
],
activeFilter: 'important',
possibleFilters: [
{ key: 'all', label: 'All' },
{ key: 'new', label: 'New' },
{ key: 'important', label: 'Important' }
]
}
function getFilteredItems(items, filter) {
switch (filter) {
case 'all':
return items;
case 'new':
return items.filter(function(item) { return Boolean(item.new); });
case 'important':
return items.filter(function(item) { return Boolean(item.important); });
default:
return items;
}
}
const App = React.createClass({
render: function() {
return (
<div>
My list:
<ItemList items={this.props.listItems} />
<div>
<Dropdown
onFilterChange={function(e) {
_store.activeFilter = e.currentTarget.value;
console.log(_store); // in real life, some action would be dispatched here
}}
filterOptions={this.props.filterOptions}
value={this.props.activeFilter}
/>
</div>
</div>
);
}
});
const ItemList = React.createClass({
render: function() {
return (
<div>
{this.props.items.map(function(item) {
return <div key={item.id}>{item.id}: {item.label}</div>;
})}
</div>
);
}
});
const Dropdown = React.createClass({
getInitialState: function() {
return {
isOpen: false
};
},
render: function() {
return (
<div>
<select
className="hidden-select"
onChange={this.props.onFilterChange}
value={this.props.value}>
{this.props.filterOptions.map(function(option) {
return <option value={option.key} key={option.key}>{option.label}</option>
})}
</select>
<div className={'custom-select' + (this.state.isOpen ? ' open' : '')} onClick={this.onClick}>
<div className="selected-value">{this.props.activeFilter}</div>
{this.props.filterOptions.map(function(option) {
return <div data-value={option.key} key={option.key}>{option.label}</div>
})}
</div>
</div>
);
},
onClick: function(e) {
this.setState({
isOpen: !this.state.isOpen
});
}
});
ReactDOM.render(
<App
listItems={getFilteredItems(_store.items, _store.activeFilter)}
filterOptions={_store.possibleFilters}
activeFilter={_store.activeFilter}
/>,
document.getElementById('root')
);
Опоры: реквизит - это не что иное, как свойство компонента и компонента реакции - это не что иное, как функция javascript.
class Welcome extends React.Component {
render() {
return <h1>Hello {this.props.name}</h1>;
}
}
const element =;
здесь <Welcome name="Sara" />
передача объекта {name: 'Sara'} как реквизит компонента Welcome. Для передачи данных из одного родительского компонента в дочерний компонент мы используем реквизиты. Реквизит неизменен. Во время жизненного цикла компонента реквизиты не должны меняться (считайте их неизменяемыми).
Состояние: состояние доступно только внутри Компонента. Чтобы отслеживать данные внутри компонента, мы используем состояние. мы можем изменить состояние с помощью setState. Если нам нужно передать состояние ребенку, мы должны передать его как реквизит.
class Button extends React.Component {
constructor() {
super();
this.state = {
count: 0,
};
}
updateCount() {
this.setState((prevState, props) => {
return { count: prevState.count + 1 }
});
}
render() {
return (<button
onClick={() => this.updateCount()}
>
Clicked {this.state.count} times
</button>);
}
}
React Components используют состояние для READ / WRITE для внутренних переменных, которые могут быть изменены / мутированы, например:
this.setState({name: 'Lila'})
Реактивный реквизит - это специальный объект, который позволяет программисту получать переменные и методы из родительского компонента в дочерний компонент.
Это что-то вроде Windows и дверей дома. Реквизиты также неизменяемы. Детский компонент не может изменять / обновлять их.
Существует несколько методов, которые помогают слушать, когда реквизит изменяется с помощью родительского компонента.
Как состояние, так и реквизит в реакции используются для управления данными в компоненте, обычно реквизиты устанавливаются родителем и передаются дочерним компонентам, и они фиксируются по всему компоненту. Для данных, которые будут меняться, мы должны использовать состояние. И реквизиты неизменяемы, в то время как состояния изменяемы, если вы хотите изменить реквизит, который вы можете сделать из родительского компонента, а затем передать его дочерним компонентам.