Can I use jsx without React to inline HTML in script?

后端 未结 8 1689
既然无缘
既然无缘 2021-01-31 02:20

Can I use inline HTML in a script as below by using a library like jsx:




        
相关标签:
8条回答
  • 2021-01-31 03:12

    You will need something to transform the JSX into JS function calls. React uses Babel to do this -- you would probably be best off with that too.

    There's a library by the creators of Preact that essentially does what you're after called vhtml. The tagline is "Render JSX/Hyperscript to HTML strings, without VDOM".

    Here is a copy of the Readme at time of writing:

    Usage

    // import the library:
    import h from 'vhtml';
    
    // tell babel to transpile JSX to h() calls:
    /** @jsx h */
    
    // now render JSX to an HTML string!
    let items = ['one', 'two', 'three'];
    
    document.body.innerHTML = (
      <div class="foo">
        <h1>Hi!</h1>
        <p>Here is a list of {items.length} items:</p>
        <ul>
          { items.map( item => (
            <li>{ item }</li>
          )) }
        </ul>
      </div>
    );
    

    New: "Sortof" Components!

    vhtml intentionally does not transform JSX to a Virtual DOM, instead serializing it directly to HTML. However, it's still possible to make use of basic Pure Functional Components as a sort of "template partial".

    When vhtml is given a Function as the JSX tag name, it will invoke that function and pass it { children, ...props }. This is the same signature as a Pure Functional Component in react/preact, except children is an Array of already-serialized HTML strings.

    This actually means it's possible to build compositional template modifiers with these simple Components, or even higher-order components.

    Here's a more complex version of the previous example that uses a component to encapsulate iteration items:

    let items = ['one', 'two'];

    const Item = ({ item, index, children }) => (
      <li id={index}>
        <h4>{item}</h4>
        {children}
      </li>
    );
    
    console.log(
      <div class="foo">
        <h1>Hi!</h1>
        <ul>
          { items.map( (item, index) => (
            <Item {...{ item, index }}>
              This is item {item}!
            </Item>
          )) }
        </ul>
      </div>
    );
    

    The above outputs the following HTML:

    <div class="foo">
      <h1>Hi!</h1>
      <ul>
        <li id="0">
          <h4>one</h4>This is item one!
        </li>
        <li id="1">
          <h4>two</h4>This is item two!
        </li>
      </ul>
    </div>
    
    0 讨论(0)
  • 2021-01-31 03:15

    JSX is not a string-based templating language; it compiles to actual JavaScript function calls. For example,

    <div attr1="something" attr2="other">
      Here are some <span>children</span>
    </div>
    

    transpiles to

    React.createElement("div", {attr1: "something", attr2: "other"}, 
      "Here are some ", React.createElement("span", null, "children")
    )
    
    0 讨论(0)
提交回复
热议问题