在反应中从 json 字符串渲染 HTML

Posted

技术标签:

【中文标题】在反应中从 json 字符串渲染 HTML【英文标题】:Render HTML from a json string in react 【发布时间】:2017-09-05 18:26:54 【问题描述】:

我正在尝试从从 API 接收的 JSON 字符串呈现 html 对象。我能够让字符串成功呈现为 HTML,但它显示了整个 JSON 字符串。我只想获取特定值(电话、姓名、身份证)。什么是我从 JSON 数组中提取特定值并将其格式化为 HTML 的最佳方式?我指的是按状态记录的记录,但我无法在渲染过程中获得记录的任何子值。

class menuScreen extends React.Component 

    constructor(props) 
        super(props)

        const data = store.getState();

        this.state = 



            username: '',
            messages: data.messages
        
    

    handleSearch(e) 
        this.setState(username: e.target.value)
    

    handleChange(evt) 
        this.setState(
            username: evt.target.value.substr(0, 100)
        );

    

    onLinkClicked() 

        var conn = new jsforce.Connection(serverUrl: 'https://cs63.salesforce.com', accessToken: sessionStorage.getItem('token'))

        var parent = this.state.username
        //console.log(this.state.username)
        conn.sobject("Contact").find(
            LastName: 
                $like: parent
            
        , 'Id, Name, Phone'

        ).sort('-CreatedDate Name').
        limit(5).skip(10).execute(function(err, records) 
            if (err) 
                return console.error(err);
            
            for (var i = 0; i < records.length; i++) 
                var record = (records[i]);
                console.log("Name: " + record.Name); //these are the records I'm trying to render
               console.log("Phone: " + record.Phone);


             this.setState(records : records)


        .bind(this));

    

    render() 
        return (
            <div className='menubox' id='menubox'>
                <div className='searchbar-container'>
                    <form onSubmit=e => e.preventDefault()>
                        <input type='text' size='25' placeholder='Contact Last Name' onChange=this.handleChange.bind(this) value=this.state.username/>
                        <button type='submit' onClick=this.onLinkClicked.bind(this)>
                            Search
                        </button>
                    </form>
                   </div>
                <div>
            <div dangerouslySetInnerHTML=  __html: JSON.stringify(this.state.records)  ></div> //how can I show specific values, isntead of the entire string?
        </div>
    </div>
        )
    

export default menuScreen;

【问题讨论】:

record.Name 更改为 record.attributes.Name 【参考方案1】:

您可以运行一个映射函数并为每个项目输出 JSX。

class menuScreen extends React.Component 

    constructor(props) 
        super(props)

        const data = store.getState();

        this.state = 
            username: '',
            messages: data.messages,
            records: [],
        ;
    

    render() 
        return (
            <div>
                this.state.records.map(record => (
                    <div>record.attributes.name record.attributes.phone record.whatever</div>
                )
            </div>
        );
    

请记住,如果您想在 map 函数中使用更复杂的 HTML 结构,则必须将其包装在单个 DOM 节点中。

完整的文件如下所示:

render() 
    return (
        <div className='menubox' id='menubox'>
            <div className='searchbar-container'>
                <form onSubmit=e => e.preventDefault()>
                    <input type='text' size='25' placeholder='Contact Last Name' onChange=this.handleChange.bind(this) value=this.state.username/>
                    <button type='submit' onClick=this.onLinkClicked.bind(this)>
                        Search
                    </button>
                </form>
            </div>
            <div>
                this.state.records.map(record => (
                    <div>record.attributes.name record.attributes.phone</div>
                )
            </div>
        </div>
    );

【讨论】:

我尝试使用 map 函数,但出现错误:“无法读取未定义的属性 'map'”。我不知道为什么,我可以用这个 来引用记录 安装组件时未定义记录。只需将默认数组添加到您的构造函数。 dangerouslySetInnerHTML 发生的事情是,它最初渲染字符串“未定义”,然后渲染 JSON 字符串。【参考方案2】:

您可以创建一个单独的渲染方法来渲染您的记录,如下所示:

renderRecords(records) 
  return records.map(r => <div> r.Name, r.Phone</div>);

然后在你的渲染方法中调用该方法,而不是像这样使用危险的SetInnerHTML

render() 
    return (
        <div className='menubox' id='menubox'>
            <div className='searchbar-container'>
                <form onSubmit=e => e.preventDefault()>
                    <input type='text' size='25' placeholder='Contact Last Name' onChange=this.handleChange.bind(this) value=this.state.username/>
                    <button type='submit' onClick=this.onLinkClicked.bind(this)>
                        Search
                    </button>
                </form>
               </div>
            <div>
        <div> this.renderRecords() </div> 
    </div>
</div>
    )

【讨论】:

【参考方案3】:

JSON.parse 将您的字符串转换为 javascript 对象。然后,您可以对该对象进行任何您想要的处理,例如删除您不需要的字段,然后您可以将JSON.stringify 重新转换为您可以呈现的 JSON 字符串。

类似:

class BlahBlah extends React.Component 
  constructor() 
    //...some code...
    this.processJson = this.processJson.bind(this)
  
  //...a lot of code...    
  processJson(json) 
    var object = JSON.parse(json)
    var output = 
    //for every property you want
    output[property] = object[property]
    return JSON.stringify(output)
  
  //...a lot more code...
  render() 
    return(
      //...even more code...
      <div dangerouslySetInnerHTML=  __html: this.processJson(this.state.records)  ></div>
      //...and yet more code.
    )
  

【讨论】:

以上是关于在反应中从 json 字符串渲染 HTML的主要内容,如果未能解决你的问题,请参考以下文章

从 JSON 对象反应渲染 HTML 对象

在python beautifulsoup中从html中提取json

如何在本机反应中从 json 获取数据?

在本机反应中从 json 对象访问特定数据

在反应中从json数据动态生成列表

如何在反应式 Java 中从 Mono<String> 获取字符串