Как мне преобразовать строку в JSX?

21

Как взять строку и преобразовать ее в jsx? Например, если я ввожу строку из textarea, как я могу преобразовать ее в элемент React;

var jsxString = document.getElementById('textarea').value;

Каков процесс, который я использовал бы для его преобразования на клиенте? Возможно ли это?

  • 0
    Не могли бы вы предоставить пример строки, которую вы хотите конвертировать в JSX?
  • 2
    <div>Hello World</div>
Показать ещё 2 комментария
Теги:
react-jsx

6 ответов

17

Вы можете использовать атрибут JSX dangerouslySetInnerHTML

Пример использования ниже:

class YourComponent{

render() {
   someHtml = '<div><strong>blablabla<strong><p>another blbla</p/></div>'

   return(
       <div className="Container" dangerouslySetInnerHTML={{__html: 
        someHtml}}></div>
    )
  }
}

Я знаю, что поздно тебе:), но надеюсь, что это может помочь кому-то еще.

  • 0
    Это не работает в случае рендеринга React Components. Don't see your post <Link to=\"/add-professor\">Add Your Post</Link> В этом случае <Link> не обрабатывается, как должно быть
4

Я использую html-to-response с некоторым успехом (самозакрывающиеся теги вызывают проблему, хотя, но исправление находится в запросах на перенос...), чтобы анализировать строки разметки как объекты типа DOM, и, в свою очередь, реагировать элементы. Это некрасиво, и если вы можете избежать этого, сделайте это. Но он выполняет свою работу.

html-to-response в github: https://github.com/mikenikles/html-to-react

  • 0
    Библиотека находится сейчас на github.com/aknuds1/html-to-react Это именно то, что я искал.
4

Если вы считаете строку

<div>Hello World</div>

Если мы очень строги, это действительно действительный JSX. Вопрос заключается в том, как скомпилировать эту строку JSX в код React.

Самый простой и рекомендуемый способ - загрузить некоторую библиотеку, такую ​​как Babel, и использовать ее для преобразования кода. Babel может работать в браузере, как repl.

Также можно преобразовать JSX в другие форматы, но в этом случае вам нужно найти компилятор или создать его самостоятельно.

Шаги по созданию самого JSX = > React transform:

  • преобразует строку кода в представление AST
  • проанализируйте AST и выведите код обратно в строку

Итак, вам нужно что-то вроде анализатора АСТ, например espree, поддерживающего JSX, а затем вы можете создать код, который проходит дерево AST и выводит что-то, например, React-code.

Дерево AST для данных JSX состоит из обычного JavaScript AST вместе с узлами JSX. Парсер должен пройти через дерево и преобразовать узлы JSX в обычный код JavaScript.

Если вы скомпилируете React и встретите JSX node с тегом "div", вы должны скомпилировать это в вызов React.createElement("div",... с атрибутами и подносами, найденными в этом AST node, вставленном в качестве параметров этого вызова.

Я создал небольшой AST Walker, который может обрабатывать дерево AST, ASTWalker, который может быть использован для преобразования дерева AST в некоторый выходной формат, например React или DOM.

Он-лайн пример того, как его использовать:

http://codepen.io/teroktolonen/pen/KzWVqx?editors=1010

Основной код выглядит следующим образом:

    // here is the JSX string to parse
    var codeStr = "<div>Hello world</div>";
    var walker = ASTWalker({
        defaultNamespace: "react",
    });
    // compile AST representation out of it.
    var rawAST = espree.parse(codeStr, {
          ecmaVersion: 6,
          sourceType: "script",
          // specify additional language features
          ecmaFeatures: {
            // enable JSX parsing
            jsx: true
          } 
        });

   // then you can walk the walk to create the code
   walker.startWalk( rawAST, {} );
   var code = walker.getCode();  
   console.log(code); 
   document.getElementById("sourceCode").innerHTML = code;

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: библиотека не предназначена для компиляции в React. В основном он используется с defaultNamespace: "DOM",, используя его для компиляции в простое представление JavaScript + DOM. Попытка сделать что-либо более сложное, чем простые теги, может привести к ошибке.

Важно отметить, что React - это не только возможный формат вывода для JSX.

1

Лично я люблю делать это так же, как и в предыдущем ответе, в котором рекомендуется использовать свойство dangerouslySetInnerHTML в JSX.

В качестве альтернативы, в настоящее время существует библиотека под названиемact -html-parser. Вы можете проверить его и установить из реестра NPM по этому адресу: https://www.npmjs.com/package/react-html-parser. Сегодня еженедельная статистика загрузки для этого пакета составляет 23 696. Выглядит довольно популярная библиотека для использования. Даже он выглядит более удобным в использовании, но мне все же нужно больше читать и больше размышлять, прежде чем реально его использовать.

Фрагмент кода, скопированный со страницы NPM:

import React from 'react';
import ReactHtmlParser, { processNodes, convertNodeToElement, htmlparser2 } from 'react-html-parser';

class HtmlComponent extends React.Component {
  render() {
    const html = '<div>Example HTML string</div>';
    return <div>{ ReactHtmlParser(html) }</div>;
  }
}
  • 1
    Гораздо лучше, чем dangerouslySetInnerHTML опция SetInnerHTML на мой взгляд
1

Я недавно столкнулся с этим ответом, и это было для меня очень выгодно. Вам не нужно предоставлять строку. Возврат массива элементов JSX сделает свое дело.

Мы можем хранить элементы JSX в массиве JavaScript.

let arrUsers = [<li>Steve</li>,<li>Bob</li>,<li>Michael</li>];

и в вашем HTML (JSX) свяжите это как,

<ul>{arrUsers}</ul>

Так просто, как есть.

  • 0
    Хм, да, это работает чертовски красиво!
-6

Вам нужно использовать babel с предустановленным react

npm install --save-dev babel-cli babel-preset-react

Добавьте в свой файл .babelrc следующую строку:

{
  "presets": ["react"]
}

Затем запустите

./node_modules/.bin/babel script.js --out-file script-compiled.js

Вы можете найти более подробную информацию здесь

  • 1
    Так что нет способа сделать это динамически. Я должен что-то запустить из командной строки, чтобы сделать это? Я хочу иметь возможность вводить строку в textarea и отображать ее на странице.
  • 0
    Нет, это просто для демонстрации, вы можете перейти на babeljs.io и увидеть реализацию многих инструментов, таких как gulp или grunt
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню