string-to-react-component
Version:
Dynamically create and render React components from strings at runtime, converting strings to React components for flexible UI generation.
181 lines (145 loc) • 5.62 kB
Markdown
Dynamically create and render React components from strings at runtime, converting strings to React components for flexible UI generation
[](https://codecov.io/gh/dev-javascript/string-to-react-component) [](http://npmjs.org/package/string-to-react-component) [](http://nodejs.org/download/) [](https://react.dev/) [](LICENSE) [](https://npmjs.org/package/string-to-react-component) [](https://travis-ci.org/ly-components/string-to-react-component)
- [Online Demo](https://dev-javascript.github.io/string-to-react-component/)
<!-- toc -->
- [Installation](
- [Basic Example](
- [Using Unknown Elements](
- [props](
- [data](
- [babelOptions](
- [Caveats](
- [Test](
- [License](
<!-- tocstop -->
```js
$ npm install string-to-react-component @babel/standalone --save
yarn add string-to-react-component @babel/standalone
```
```js
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script src="https://unpkg.com/string-to-react-component@latest/dist/stringToReactComponent.umd.min.js"></script>
// This will create a global function StringToReactComponent
```
```js
import StringToReactComponent from 'string-to-react-component';
function App() {
return (
<StringToReactComponent>
{`(props)=>{
const [counter,setCounter]=React.useState(0); // by default your code has access to the React object
const increase=()=>{
setCounter(counter+1);
};
return (<>
<button onClick={increase}>+</button>
<span>{'counter : '+ counter}</span>
</>);
}`}
</StringToReactComponent>
);
}
```
- The given code inside the string should be a function.
- The code inside the string has access to the `React` object and for using `useState`, `useEffect`, `useRef` and ... you should get them from `React` object or pass them as `data` prop to the component:
```js
import {useState} from 'react';
import StringToReactComponent from 'string-to-react-component';
function App() {
return (
<StringToReactComponent data={{useState}}>
{`(props)=>{
console.log(typeof useState); // undefined
console.log(typeof React.useState); // function
console.log(typeof props.useState); // function
...
}`}
</StringToReactComponent>
);
}
```
```js
import StringToReactComponent from 'string-to-react-component';
import MyFirstComponent from 'path to MyFirstComponent';
import MySecondComponent from 'path to MySecondComponent';
function App() {
return (
<StringToReactComponent data={{MyFirstComponent, MySecondComponent}}>
{`(props)=>{
const {MyFirstComponent, MySecondComponent}=props;
return (<>
<MyFirstComponent/>
<MySecondComponent/>
</>);
}`}
</StringToReactComponent>
);
}
```
- type : `object`
- required : `No`
- `data` object is passed to the component(which is generated from the string) as props
- example :
```js
import {useState} from 'react';
import StringToReactComponent from 'string-to-react-component';
function App() {
const [counter, setCounter] = useState(0);
const increase = () => {
setCounter(counter + 1);
};
return (
<StringToReactComponent data={{counter, increase}}>
{`(props)=>{
return (<>
<button onClick={props.increase}>+</button>
<span>{'counter : '+ props.counter}</span>
</>);
}`}
</StringToReactComponent>
);
}
```
- type : `object`
- required : `No`
- default value : `{presets: ["react"],sourceMaps: "inline"}`
- See the full option list [here](https://babeljs.io/docs/en/options)
- examples :
- using typescript :
```js
<StringToReactComponent
babelOptions={{filename: 'counter.ts', presets: ['react', ['typescript', {allExtensions: true, isTSX: true}]]}}>
{`()=>{
const [counter,setCounter]=React.useState<number>(0);
const increase=()=>{
setCounter(counter+1);
};
return (<>
<button onClick={increase}>+</button>
<span>{'counter : '+ counter}</span>
</>);
}`}
</StringToReactComponent>
```
This plugin does not use `eval` function, however, suffers from security and might expose you to XSS attacks
To prevent XSS attacks, You should sanitize user input before storing it.
```js
$ npm run test
```
MIT