🦉 Пропсы(Props) 🦉
Содержание
Введение
В Owl props
(сокращение от properties) — это объект, который содержит все данные,
переданные компоненту его родителем.
class Child extends Component {
static template = xml`<div><t t-esc="props.a"/><t t-esc="props.b"/></div>`;
}
class Parent extends Component {
static template = xml`<div><Child a="state.a" b="'string'"/></div>`;
static components = { Child };
state = useState({ a: "fromparent" });
}
В этом примере компонент Child
получает от своего родителя два реквизита: a
и b
. Owl собирает их в объект props
, при этом каждое значение оценивается в
контексте родителя. Таким образом, props.a
равно 'fromparent'
, а props.b
равно 'string'
.
Обратите внимание, что props
— это объект, который имеет смысл только с точки
зрения дочернего компонента.
Определение
Объект props
состоит из всех атрибутов, определенных в шаблоне, за следующими
исключениями:
- каждый атрибут, начинающийся с
t-
, не является пропсом (это директивы QWeb), - также исключены атрибуты
style
иclass
(они применяются Owl к корневому элементу компонента).
В следующем примере:
<div>
<ComponentA a="state.a" b="'string'"/>
<ComponentB t-if="state.flag" model="model"/>
<ComponentC style="color:red;" class="left-pane" />
</div>
объект props
содержит следующие ключи:
- для
ComponentA
:a
иb
, - для
ComponentB
:model
, - для
ComponentC
: пустой объект
Хорошая практика
Объект props
— это набор значений, исходящих от родителя. Таким образом,
они принадлежат родителю и никогда не должны изменяться потомком:
class MyComponent extends Component {
constructor(parent, props) {
super(parent, props);
props.a.b = 43; // Never do that!!!
}
}
Пропсы следует рассматривать только для чтения с точки зрения дочернего компонента. Если есть необходимость их модифицировать, то запрос на их обновление должен быть отправлен родителю (например, с событием).
Любое значение может быть в пропсе. Строки, объекты, классы или даже обратные вызовы могут быть переданы дочернему компоненту (но тогда, в случае обратных вызовов, связь с событиями кажется более подходящей).
Динамические пропсы
Директиву t-props
можно использовать для указания полностью динамических реквизитов:
<div t-name="ParentComponent">
<Child t-props="some.obj"/>
</div>
class ParentComponent {
static components = { Child };
some = { obj: { a: 1, b: 2 } };
}