使用JQuery很好地将DOM元素添加到DOM

Ell*_*Coe 5 html syntax jquery append jsx

目前,我在DOM中添加元素,并在双引号内附加html,这可能会变得非常混乱并且很难阅读,特别是如果你内部有变量,在React中你会使用干净的JSX,是否有在普通的JQuery脚本或JSX之类的东西中使用JSX的方法?

T.J*_*der 3

是的,有两个选择:

  1. 模板文字

  2. JSX

模板文字

在现代 JavaScript 中,您可以使用模板文字而不是字符串文字,并且它们可以包含带有 JavaScript 表达式的占位符:

let counter = 0;

$(`<table class="main">
    <tbody>
        <tr>
            <td>Cell ${counter++}</td>
            <td>Cell ${counter++}</td>
        </tr>
        <tr>
            <td>Cell ${counter++}</td>
            <td>Cell ${counter++}</td>
        </tr>
    </tbody>
</table>`).appendTo(document.body);
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

当然,仍然有一些尴尬,但它比字符串文字要好得多。

有关模板文字的更多信息,请参见 MDN

JSX

JSX 不仅限于 React。它有自己的规范和多种实现,例如jsx-transform.

例如,下面是一个简单的 Node.js 包装器,它使用它来转译文件:

var jsx = require('jsx-transform');

console.log(jsx.fromFile("input.jsx", {
  factory: 'be'
}));
Run Code Online (Sandbox Code Playgroud)

如果input.jsx是:

let counter = 0;
let table =
    <table class="main">
        <tbody>
            <tr>
                <td>Cell {counter++}</td>
                <td>Cell {counter++}</td>
            </tr>
            <tr>
                <td>Cell {counter++}</td>
                <td>Cell {counter++}</td>
            </tr>
        </tbody>
    </table>;
table.appendTo(document.body);
Run Code Online (Sandbox Code Playgroud)

(请注意,这是class="main",而不是className="main"。使用classNameReact 来代替是为了避免出现自 2009 年 ES5 推出以来一直没有出现过的问题。)

输出将是:

let counter = 0;
let table =
    be('table', {class: "main"}, [
        be('tbody', null, [
            be('tr', null, [
                be('td', null, ["Cell ", counter++]),
                be('td', null, ["Cell ", counter++])
            ]),
            be('tr', null, [
                be('td', null, ["Cell ", counter++]),
                be('td', null, ["Cell ", counter++])
            ])
        ])
    ]);
table.appendTo(document.body);
Run Code Online (Sandbox Code Playgroud)

请注意 JSX 表达式如何转换为对工厂函数的调用(be在该示例中;React 的工厂函数是React.createElement)。您所要做的就是提供该be函数并将转换器集成到您的构建链中(jsx-transform预烘焙后能够插入 Browserify)。

be使用的 jQuery 可能看起来像这样:

function be(tagName, attributes, children) {
    const result = $("<" + tagName + "/>");
    if (attributes) {
        result.attr(attributes);
    }
    if (children) {
        if (Array.isArray(children)) {
            for (const child of children) {
                result.append(child);
            }
        } else {
            result.append(child);
        }
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

使用转换结果的 be 函数的实时示例:

var jsx = require('jsx-transform');

console.log(jsx.fromFile("input.jsx", {
  factory: 'be'
}));
Run Code Online (Sandbox Code Playgroud)
let counter = 0;
let table =
    <table class="main">
        <tbody>
            <tr>
                <td>Cell {counter++}</td>
                <td>Cell {counter++}</td>
            </tr>
            <tr>
                <td>Cell {counter++}</td>
                <td>Cell {counter++}</td>
            </tr>
        </tbody>
    </table>;
table.appendTo(document.body);
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,事情确实就是这么简单。