Я использую ReactJS, и часть моего приложения требует хорошо напечатанного JSON.
Я получаю JSON, например:, { "foo": 1, "bar": 2 }
и если я пропущу его JSON.stringify(obj, null, 4)
в консоли браузера, он хорошо распечатывается, но когда я использую его в этом фрагменте реакции:
render: function() {
var json = this.getStateFromFlux().json;
return (
<div>
<JsonSubmitter onSubmit={this.onSubmit} />
{ JSON.stringify(json, null, 2) }
</div>
);
},
он отображает грубый JSON, который выглядит как "{ \"foo\" : 2, \"bar\": 2}\n"
.
Как мне правильно интерпретировать эти символы? {
javascript
json
reactjs
flux
Брэндон
источник
источник
JSON.stringify(json, null, "\t")
?this.getStateFromFlux().json
уже возвращалась строка. Я модифицировал его, чтобы вместо этого он содержал объект JS, и теперь он работает безупречно.Ответы:
Вам нужно будет либо
BR
соответствующим образом вставить тег в результирующую строку, либо использовать, например,PRE
тег, чтобыstringify
сохранить форматирование :var data = { a: 1, b: 2 }; var Hello = React.createClass({ render: function() { return <div><pre>{JSON.stringify(data, null, 2) }</pre></div>; } }); React.render(<Hello />, document.getElementById('container'));
Рабочий пример .
Обновить
class PrettyPrintJson extends React.Component { render() { // data could be a prop for example // const { data } = this.props; return (<div><pre>{JSON.stringify(data, null, 2) }</pre></div>); } } ReactDOM.render(<PrettyPrintJson/>, document.getElementById('container'));
Функциональный компонент без сохранения состояния, React .14 или выше
const PrettyPrintJson = ({data}) => { // (destructured) data could be a prop for example return (<div><pre>{ JSON.stringify(data, null, 2) }</pre></div>); }
Или, ...
const PrettyPrintJson = ({data}) => (<div><pre>{ JSON.stringify(data, null, 2) }</pre></div>);
Рабочий пример
Памятка / 16.6+
(Возможно, вы даже захотите использовать памятку, 16.6+)
const PrettyPrintJson = React.memo(({data}) => (<div><pre>{ JSON.stringify(data, null, 2) }</pre></div>));
источник
Просто чтобы немного расширить ответ WiredPrairie, мини-компонент, который можно открывать и закрывать.
Может использоваться как:
<Pretty data={this.state.data}/>
export default React.createClass({ style: { backgroundColor: '#1f4662', color: '#fff', fontSize: '12px', }, headerStyle: { backgroundColor: '#193549', padding: '5px 10px', fontFamily: 'monospace', color: '#ffc600', }, preStyle: { display: 'block', padding: '10px 30px', margin: '0', overflow: 'scroll', }, getInitialState() { return { show: true, }; }, toggle() { this.setState({ show: !this.state.show, }); }, render() { return ( <div style={this.style}> <div style={this.headerStyle} onClick={ this.toggle }> <strong>Pretty Debug</strong> </div> {( this.state.show ? <pre style={this.preStyle}> {JSON.stringify(this.props.data, null, 2) } </pre> : false )} </div> ); } });
Обновить
Более современный подход (теперь createClass на выходе)
import styles from './DebugPrint.css' import autoBind from 'react-autobind' import classNames from 'classnames' import React from 'react' export default class DebugPrint extends React.PureComponent { constructor(props) { super(props) autoBind(this) this.state = { show: false, } } toggle() { this.setState({ show: !this.state.show, }); } render() { return ( <div style={styles.root}> <div style={styles.header} onClick={this.toggle}> <strong>Debug</strong> </div> {this.state.show ? ( <pre style={styles.pre}> {JSON.stringify(this.props.data, null, 2) } </pre> ) : null } </div> ) } }
И ваш файл стиля
.root {backgroundColor: '# 1f4662'; цвет: '#fff'; fontSize: '12px'; }
.header {backgroundColor: '# 193549'; отступ: '5px 10px'; fontFamily: 'моноширинный'; цвет: '# ffc600'; }
.pre {дисплей: 'блок'; отступ: '10px 30px'; маржа: «0»; переполнение: 'прокрутка'; }
источник
« Response-json-view » предоставляет решение для рендеринга строки json.
import ReactJson from 'react-json-view'; <ReactJson src={my_important_json} theme="monokai" />
источник
const getJsonIndented = (obj) => JSON.stringify(newObj, null, 4).replace(/["{[,\}\]]/g, "") const JSONDisplayer = ({children}) => ( <div> <pre>{getJsonIndented(children)}</pre> </div> )
Тогда вы легко сможете использовать это:
const Demo = (props) => { .... return <JSONDisplayer>{someObj}<JSONDisplayer> }
источник
Вот демонстрация
react_hooks_debug_print.html
перехватчиков реакции, основанная на ответе Криса. Пример данных json взят с https://json.org/example.html .<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Hello World</title> <script src="https://unpkg.com/react@16/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script> <!-- Don't use this in production: --> <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script> </head> <body> <div id="root"></div> <script src="https://raw.githubusercontent.com/cassiozen/React-autobind/master/src/autoBind.js"></script> <script type="text/babel"> let styles = { root: { backgroundColor: '#1f4662', color: '#fff', fontSize: '12px', }, header: { backgroundColor: '#193549', padding: '5px 10px', fontFamily: 'monospace', color: '#ffc600', }, pre: { display: 'block', padding: '10px 30px', margin: '0', overflow: 'scroll', } } let data = { "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "GlossList": { "GlossEntry": { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": { "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": [ "GML", "XML" ] }, "GlossSee": "markup" } } } } } const DebugPrint = () => { const [show, setShow] = React.useState(false); return ( <div key={1} style={styles.root}> <div style={styles.header} onClick={ ()=>{setShow(!show)} }> <strong>Debug</strong> </div> { show ? ( <pre style={styles.pre}> {JSON.stringify(data, null, 2) } </pre> ) : null } </div> ) } ReactDOM.render( <DebugPrint data={data} />, document.getElementById('root') ); </script> </body> </html>
Или вот так добавьте стиль в заголовок:
<style> .root { background-color: #1f4662; color: #fff; fontSize: 12px; } .header { background-color: #193549; padding: 5px 10px; fontFamily: monospace; color: #ffc600; } .pre { display: block; padding: 10px 30px; margin: 0; overflow: scroll; } </style>
И замените
DebugPrint
на следующее:const DebugPrint = () => { // /programming/30765163/pretty-printing-json-with-react const [show, setShow] = React.useState(false); return ( <div key={1} className='root'> <div className='header' onClick={ ()=>{setShow(!show)} }> <strong>Debug</strong> </div> { show ? ( <pre className='pre'> {JSON.stringify(data, null, 2) } </pre> ) : null } </div> ) }
источник