🦉 Пропсы(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 } };
}