2024-05-31 14:31:27 +00:00
---
id: custom-component
title: Custom Component
---
2024-10-25 09:32:28 +00:00
**Custom Component** can be used to create your own React component when the needed functionality isn't available in other components.
2024-05-31 14:31:27 +00:00
< div style = {{textAlign: ' center ' } } >
< img style = {{ border: ' 0 ' , marginBottom: ' 15px ' , borderRadius: ' 5px ' , boxShadow: ' 0px 1px 3px rgba ( 0 , 0 , 0 , 0 . 2 ) ' } } className = "screenshot-full" src = "/img/widgets/custom-component/custom-component-v2.png" alt = "ToolJet - Widget Reference - Custom Component" / >
< / div >
2024-10-25 09:32:28 +00:00
< div style = {{paddingTop:'24px'}} >
2024-05-31 14:31:27 +00:00
## Properties
### Data
2024-10-25 09:32:28 +00:00
The data needs to be an object that needs to be passed as **data** props to the **Custom Component** .
2024-05-31 14:31:27 +00:00
**Example:**
```json
{{{
title: "Hi! There",
buttonText: "Updated Text",
queryName: "runjs1"
}}}
```
### Code
2024-10-25 09:32:28 +00:00
This field is used to add a React code for your custom component. The packages for the custom component can be imported from [Skypack ](https://www.skypack.dev/ ) or [esm ](https://esm.sh/ ). For example, to import **React** package into the custom component it can be imported as `import React from 'https://cdn.skypack.dev/react'` .
2024-05-31 14:31:27 +00:00
2024-10-25 09:32:28 +00:00
ToolJet provides 3 props to interact with the app:
- **data** is a shared object between a custom component and the ToolJet app.
- **updateData** is a function that accepts a single object used to update the data passed to the custom component.
- **runQuery** is a function that accepts a query name as a string used to run the query from the custom component.
2024-05-31 14:31:27 +00:00
**Example:**
```js
import React from "https://cdn.skypack.dev/react";
import ReactDOM from "https://cdn.skypack.dev/react-dom";
import { Button, Container, Link } from "https://cdn.skypack.dev/@material-ui/core";
const MyCustomComponent = ({data, updateData, runQuery}) => (
< Container >
< h1 > {data.title}< / h1 >
< Button
color="primary"
variant="outlined"
onClick={() => {updateData({...data, title: 'Hello World!!'})}}>
{data.buttonText}
< / Button >
< Button
color="primary"
variant="outlined"
onClick={() => {runQuery(data.queryName)}}
>
Run Query
< / Button >
< / Container >
);
const ConnectedComponent = Tooljet.connectComponent(MyCustomComponent);
ReactDOM.render(< ConnectedComponent / > , document.body);
```
:::info
2024-10-25 09:32:28 +00:00
`Tooljet.connectComponent` acts as a HOC and it is required to get access to the data passed into the custom component and run the query.
2024-05-31 14:31:27 +00:00
:::
< / div >
2024-10-25 09:32:28 +00:00
< div style = {{paddingTop:'24px'}} >
2024-05-31 14:31:27 +00:00
## Component Specific Actions (CSA)
There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component.
< / div >
2024-10-25 09:32:28 +00:00
< div style = {{paddingTop:'24px'}} >
2024-05-31 14:31:27 +00:00
## Exposed Variables
| < div style = {{ width: " 100px " } } > Variables < / div > | < div style = {{ width: " 135px " } } > Description < / div > | < div style = {{ width: " 135px " } } > How To Access < / div > |
|:----------- |:----------- |:---------- |
2024-10-25 09:32:28 +00:00
| data | This variable will hold the variables assigned inside the `code` for custom component.| Access the value dynamically using JS: `{{components.customcomponent1.data.title}}` .|
2024-05-31 14:31:27 +00:00
< / div >
2024-10-25 09:32:28 +00:00
< div style = {{paddingTop:'24px'}} >
2024-05-31 14:31:27 +00:00
## General
### Tooltip
2024-10-25 09:32:28 +00:00
A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component.
2024-05-31 14:31:27 +00:00
2024-10-25 09:32:28 +00:00
Under the < b > General< / b > accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip.
2024-05-31 14:31:27 +00:00
< / div >
2024-10-25 09:32:28 +00:00
< div style = {{paddingTop:'24px'}} >
2024-05-31 14:31:27 +00:00
## Layout
| < div style = {{ width: " 100px " } } > Layout < / div > | < div style = {{ width: " 100px " } } > Description < / div > | < div style = {{ width: " 135px " } } > Expected Value < / div > |
|:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- |
2024-10-25 09:32:28 +00:00
| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}` . |
| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}` . |
2024-05-31 14:31:27 +00:00
< / div >
2024-10-25 09:32:28 +00:00
< div style = {{paddingTop:'24px'}} >
----
2024-05-31 14:31:27 +00:00
## Styles
| < div style = {{ width: " 100px " } } > Style < / div > | < div style = {{ width: " 100px " } } > Description < / div > | < div style = {{ width: " 100px " } } > Default value < / div > |
|:---------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |:--------- |
2024-10-25 09:32:28 +00:00
| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not visible after the app is deployed. | By default, it's set to `{{true}}` . |
2024-05-31 14:31:27 +00:00
:::info
2024-10-25 09:32:28 +00:00
Any property having **fx** button next to its field can be **programmatically configured** .
2024-05-31 14:31:27 +00:00
:::
2024-10-25 09:32:28 +00:00
< / div >