Enable Dark Mode!
an-overview-of-props-in-owl.jpg
By: Sruthi C Nair

An Overview of Props in Owl

Technical Odoo 16

In the dynamic landscape of web development, creating modular and reusable components is paramount for building scalable applications. One such framework that takes this approach to the next level is Owl, where the concept of "props" (short for properties) plays a pivotal role in orchestrating communication between parent and child components. In the Owl framework, props serve as a crucial mechanism for passing data from a parent component to its child. Let's delve into the intricacies of Owl props, exploring their definition, comparison, binding functions, and dynamic usage.

Introduction to Owl Props

Owl's architecture revolves around components, encapsulating specific functionalities or user interface elements. At the core of this architectural design is the concept of "props." These properties enable the seamless transmission of information between different components, fostering collaboration within the application. In essence, Owl's use of props enhances the modularity of components, allowing them to remain focused on specific tasks while contributing to a cohesive and scalable web application.
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" });
}
In this example, the Child component receives two props (a and b) from its parent (Parent). The values are collected into a props object by Owl, with each value evaluated in the context of the parent. Consequently, props.a equals 'fromparent,' and props.b equals 'string.'

Definition of Owl Props

The props object in Owl serves as a container for attributes defined in a component's template. This object, however, excludes attributes starting with t-, which are reserved for QWeb directives. This distinction ensures a clear and purposeful interaction between parent and child components, reinforcing the seamless flow of data.
<div>
    <ComponentA a="state.a" b="'string'"/>
    <ComponentB t-if="state.flag" model="model"/>
</div>
In this snippet, the props object for ComponentA contains keys a and b, while for ComponentB, it includes only the key model.

Props Comparison

When Owl encounters a subcomponent in a template, it performs a shallow comparison of all props. If all props are referentially equal, the subcomponent remains unaltered. However, if at least one prop changes, Owl triggers an update. To handle cases where values are different but have the same effect, the .alike suffix is employed.
<t t-foreach="todos" t-as="todo" t-key="todo.id">
  <Todo todo="todo" onDelete.alike="() => deleteTodo(todo.id)" />
</t>
The .alike suffix informs Owl that the specific prop should always be considered equivalent, preventing unnecessary updates.

Binding Function Props

In the context of passing callbacks as props, Owl offers a convenient solution for binding functions. While manual binding is feasible, Owl simplifies the process with the .bind suffix.
class SomeComponent extends Component {
  static template = xml`
    <div>
      <Child callback.bind="doSomething"/>
    </div>`;
  doSomething() {
    // ...
  }
}
The .bind suffix not only binds the callback but also implies .alike, ensuring these props don't trigger additional renderings.

Dynamic Props

Owl introduces the t-props directive to specify dynamically changing props. This proves useful when the props need to adapt to evolving scenarios.
<div t-name="ParentComponent">
    <Child t-props="some.obj"/>
</div>

Default Props

If the static defaultProps property is defined, it completes the missing props received by the parent. This enhances the predictability and consistency of component behavior.
class Counter extends owl.Component {
  static defaultProps = {
    initialValue: 0,
  };
  ...
}

Props Validation

As applications grow in complexity, ensuring the safety and correctness of props becomes paramount. Owl addresses this with a props type system, validating types and shapes of props during component creation/update.
class ComponentA extends owl.Component {
    static props = ['id', 'url'];
    ...
}
class ComponentB extends owl.Component {
  static props = {
    count: {type: Number},
    messages: {
      type: Array,
      element: {type: Object, shape: {id: Boolean, text: String }
    },
   date: Date,
   combinedVal: [Number, Boolean],
   optionalProp: { type: Number, optional: true }
  };
  ...
}
By defining prop types, components become self-documenting, providing clarity on usage and minimizing the risk of sending incorrect props. This meticulous approach to prop validation adds a layer of robustness to Owl's framework, ensuring a stable and error-resistant development experience.

Good Practices with Props

In adhering to best practices, it's crucial to treat props as read-only from the perspective of the child component. Any modification should be communicated to the parent through events, ensuring a clean and predictable data flow. This adherence to clean communication practices further reinforces the reliability and maintainability of Owl-based applications.
In conclusion, the strategic use of props in Odoo's Owl framework is instrumental in building modular, scalable, and maintainable web applications. This powerful concept empowers developers to create robust, interconnected components that contribute to a streamlined and efficient development process. By embracing the nuances of prop definition, comparison, and validation, developers can unlock the full potential of Owl props for a seamless and delightful web development experience.
To read more about the overview of the owl reactivity system in Odoo 16, refer to our blog An Overview of Owl Reactivity System in Odoo 16


If you need any assistance in odoo, we are online, please chat with us.



0
Comments



Leave a comment



whatsapp_icon
location

Calicut

Cybrosys Technologies Pvt. Ltd.
Neospace, Kinfra Techno Park
Kakkancherry, Calicut
Kerala, India - 673635

location

Kochi

Cybrosys Technologies Pvt. Ltd.
1st Floor, Thapasya Building,
Infopark, Kakkanad,
Kochi, India - 682030.

location

Bangalore

Cybrosys Techno Solutions
The Estate, 8th Floor,
Dickenson Road,
Bangalore, India - 560042

Send Us A Message