UNPKG

reblendjs

Version:

ReblendJs uses Reactjs pradigm to build UI components, with isolated state for each components.

243 lines (180 loc) β€’ 7.46 kB
# ReblendJS ReblendJS is a lightweight frontend library that seamlessly integrates the flexibility of React with the efficiency of Web Components. It offers a modular approach to state management and component rendering, ensuring fast and predictable UI updates. ## πŸš€ Features - βœ… **Supports Standard HTML & React Attributes** – Write components using familiar syntax. - βœ… **JSX Support** – Use `for`, `style` (as a string), `class` (as `classNames`), and standard attributes. - βœ… **React Component Compatibility** – Use React components within ReblendJS. - βœ… **Uses React's Build Tools** – No need to change your existing setup. - βœ… **Functional Components Compile to Classes** – Optimized for performance. - βœ… **Single Execution for Functional Components** – No unnecessary re-renders. - βœ… **Web Component Native Support** – Directly renders existing `HTMLElement` instances without wrappers. - βœ… **Simple API & Easy to Learn** – Minimal boilerplate, quick to get started. - βœ… **Built-in Hooks Support** – Manage state and side effects seamlessly. - βœ… **Component-Level State Management** – Each element holds its own state. - βœ… **No Mixed or Async State Rendering** – Eliminates issues with pre/post rendering. - βœ… **Faster Rendering** – State is localized within each element, reducing unnecessary updates. - βœ… **Async Components & Rendering** – Out-of-the-box support for async components and lazy loading. --- ## ⚑ Async Components & Rendering ReblendJS supports **async components and async rendering** natively. You can return a `Promise` from your component, enabling features like code-splitting and conditional lazy loading without extra libraries. Example: ```js import Reblend from "reblendjs"; import { useIsAdmin } from "../../lib/hooks"; export async function AdvertPage() { const isAdmin = useIsAdmin(); return ( <> {isAdmin ? import("../admin/advert/admin-advert").then((m) => m.default) : import("./advert").then((m) => m.default)} </> ); } ``` Just use `async` components and return Promises or dynamic importsβ€”ReblendJS will handle the rendering automatically. --- ## πŸ“¦ Installation To quickly set up a new ReblendJS project with TypeScript, use: ```sh npx create-reblend-app --template typescript ./my-app ``` Alternatively, install ReblendJS manually: ```sh npm install reblendjs ``` or ```sh yarn add reblendjs ``` --- ## πŸ› οΈ Usage ### Mounting Components to the DOM ReblendJS uses `mountOn` to attach components to the DOM: ```js import Reblend from 'reblendjs'; import App from './App'; Reblend.mountOn('root', App); ``` ### Functional Component Example ReblendJS **recommends using functional components** for better performance, as they are efficiently compiled into class components: ```js import Reblend, { useState } from 'reblendjs'; const Counter = () => { const [count, setCount] = useState(0); return ( <div> <h1>Counter: {count}</h1> <button onClick={() => setCount(count + 1)}>Increment</button> </div> ); }; Reblend.mountOn('root', Counter); ``` ### JSX Support (`for`, `style`, `class`, and Attributes) ReblendJS **fully supports JSX attributes**, including: - βœ… `for` (instead of `htmlFor` in React) - βœ… `style` (as a **string**, unlike React's object-based approach) - βœ… `class` (as `classNames`) - βœ… Standard attributes (`id`, `name`, `placeholder`, etc.) Example: ```js const FormExample = () => { return ( <form> <label for="name">Name:</label> <input id="name" type="text" placeholder="Enter your name" /> <button class="btn btn-primary" style="background-color: blue; padding: 10px;" > Submit </button> </form> ); }; Reblend.mountOn('root', FormExample); ``` --- ## 🎯 Use Cases ReblendJS is ideal for: - **Building Web Components** – Create reusable elements without React wrappers. - **Optimizing Performance** – When React’s Virtual DOM is too heavy. - **Progressive Enhancement** – Use ReblendJS alongside native HTML. - **Embedding in Non-React Projects** – Works well in vanilla JS applications. --- ## βš–οΈ ReblendJS vs React | Feature | ReblendJS | ReactJS | | --------------------------- | -------------------------------------- | ----------------------------------------------- | | Standard HTML Attributes | βœ… Supports all | βœ… Supports all | | JSX `for`, `style`, `class` | βœ… Fully supported | ❌ `htmlFor`, `style` as an object, `className` | | React Component Support | βœ… Fully Compatible | βœ… Native | | Functional Components | βœ… Compiled to Classes | βœ… Functional with Hooks | | Hooks | βœ… Supported | βœ… Supported | | Web Component Support | βœ… Native (renders without wrapper) | ❌ Requires wrappers like `React.createElement` | | State Management | βœ… Localized in elements | βœ… Centralized (React Context, Redux) | | Rendering Performance | βœ… Faster (isolated state per element) | ⚠️ Slower when dealing with large states | | Build Tool | βœ… Uses React's toolchain | βœ… Uses its own build tools | | Learning Curve | βœ… Simpler syntax, minimal setup | ⚠️ More concepts (Virtual DOM, Reconciliation) | --- ## 🎨 Example: Modal with Button Interaction Using Bootstrap Components with ReblendJS Here’s an example of creating a button that toggles a modal: ```js import { Button } from 'react-bootstrap'; import Reblend, { useState } from 'reblendjs'; import Modal from 'react-bootstrap/Modal'; export function MyVerticallyCenteredModal(props: any) { return ( <Modal {...props} size="lg" aria-labelledby="contained-modal-title-vcenter" centered closeButton > <Modal.Header> <Modal.Title id="contained-modal-title-vcenter"> Modal heading </Modal.Title> </Modal.Header> <Modal.Body> <h4>Centered Modal</h4> <p> Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. </p> </Modal.Body> <Modal.Footer> <Button onClick={props.onHide}>Close</Button> </Modal.Footer> </Modal> ); } const App = () => { const [modalShow, setModalShow] = useState(false); const toggleModal = () => { setModalShow(!modalShow); }; return ( <div> <Button variant="primary" onClick={toggleModal}> Toggle Modal </Button> <MyVerticallyCenteredModal show={modalShow} onHide={toggleModal} /> </div> ); }; Reblend.mountOn('root', App); ``` --- ## πŸ—οΈ Contributing We welcome contributions! Feel free to submit issues or pull requests. ### Steps to Contribute: 1. Fork the repository. 2. Create a new branch. 3. Commit your changes. 4. Open a pull request. --- ## πŸ“œ License [MIT License.](LICENSE)