【问题标题】:React - Dynamic AJAX loading HTML data not working in dangerouslySetInnerHTMLReact - 动态 AJAX 加载 HTML 数据在危险的 SetInnerHTML 中不起作用
【发布时间】:2017-06-11 09:36:39
【问题描述】:

我无法在dangerouslySetInnerHTML 中动态地加载 AJAX 格式的 HTML 格式数据(如下所述)(即,它在 DOM 中设置为相同的字符串而不是编译)。请注意,我正在使用 axios 插件进行 AJAX API 调用。当我尝试在dangerouslySetInnerHTML 中静态提供相同的 HTML 数据时,它运行良好。我不知道那里发生了什么。

[{id: 1, image: "assets/img/news-sm.png", content: "<p>சிறுவனே!</p>"}]

我的 React 组件代码是

import React, { Component, PropTypes } from 'react';
import List from 'material-ui/List/List';
import ListItem from 'material-ui/List/ListItem';
import Divider from 'material-ui/Divider';
import { Media } from 'react-bootstrap';
import { map } from 'lodash';

class NewsList extends Component {
    constructor(props) {
        super(props);
    }

    handleListClick(d){
        console.log(d);
    }

    renderLoadingComponent() {
        return <ListItem style={{textAlign: 'center'}}>Loading...</ListItem>;
    }

    renderNothingFoundElement() {
        return <ListItem style={{textAlign: 'center'}}>Nothing found</ListItem>;
    }

    render() {
        const { data, loading } = this.props;

        return (
            <List className="list">
                {
                    map(data, (d, index) =>
                        React.Children.toArray([
                            <ListItem className="list-item">
                                <Media onClick={(ev) => this.handleListClick(d)} className="media-align">
                                    <Media.Left align="middle">
                                        <img width={75} height={56} src={d.image} alt="news-image"/>
                                    </Media.Left>
                                    <Media.Body>
                                        {d.content && <p dangerouslySetInnerHTML={{ __html: d.content }}></p>}
                                    </Media.Body>
                                </Media>
                            </ListItem>,
                            (index + 1) !== data.length ? <Divider /> : ''
                        ])
                    )
                }

                { loading ? this.renderLoadingComponent() : data.length === 0 ? this.renderNothingFoundElement() : '' }
            </List>
        )
    }
}

NewsList.propTypes = {
    data: React.PropTypes.array.isRequired
};

export default NewsList;

我正在像这样从另一个组件调用上述组件

import React, { Component, PropTypes } from 'react';
import NewsList from '../components/news-list';

class Home extends Component {
    constructor(props) {
        super(props);

        this.state = { ajaxData: [], ajaxLoading: false }
    }

    componentDidMount() {
        axios.get('/ajaxUrl')
            .then(response => this.setState({ajaxData: response.data}))
    }

    render() {
        return (
            <NewsList data={this.state.ajaxData} loading={this.state.ajaxLoading} />
        )
    }
}


有人可以帮我解决这个问题吗?谢谢。

【问题讨论】:

  • 没有足够的代码。请展示整个组件,包括获取数据的代码。
  • @RishatMuhametshin 嗨。我已经编辑了帖子。你能看看这个,让我知道我是否应该添加更多?

标签: javascript html reactjs jsx


【解决方案1】:

可能你必须指定组件生命周期 shouldComponentUpdate 或 forceUpdate 或 componentWillReceiveProps facebook.github.io

但您也可以使用 huck 并将父组件中的状态设置为 '' 并在回调中设置 NewList 并传递道具

this.setState({newList: ''},()=> this.setState({ newList: <NewList {...props}/>}))

更新简单的

class Home extends Component {
constructor(props) {
    super(props);

    this.state = { ajaxData: [], ajaxLoading: false, newsList:'' }
}

componentDidMount() {
    axios.get('/ajaxUrl')
        .then(response => this.setState({ajaxData: response.data},
()=> this.setState({newsList: <NewsList data={this.state.ajaxData} loading={this.state.ajaxLoading} />})))
 }

render() {
    return (
        <div> {this.state.newsList} <div/>
    )
}}

你也可以实现一个生命周期的方法

shouldComponentUpdate(nextProps, nextState) {
    return this.state.ajaxData != nextState.ajaxData;
  }

【讨论】:

  • 感谢您的回答。我刚刚用完整的代码更新了整个帖子。你能给我更详细的答案代码吗?
  • @AbrahamGnanasingh 试试这个
  • 试过了。仍然没有编译相同的字符串。当我还添加shouldComponentUpdate 代码时,它停止了渲染。请注意,通过 Inspect Element 中的 Network,我的回复实际上是这样的 [{id: 1, image: "assets/img/news-sm.png", content: "&amp;lt;p&amp;gt;சிறுவனே!&amp;lt;/p&amp;gt;"}]。对此感到抱歉。
  • @AbrahamGnanasingh 您是否尝试将一些不同的内容放入
  • 对新闻列表也试试这个componentDidUpdate(prevProp, prevState){ this.refs.news.innerHTML = this.props.ajaxData.content; }&lt;Media.Body&gt;&lt;div ref='news'/&gt;&lt;/Media.Body&gt;
猜你喜欢
  • 2021-12-21
  • 2021-06-24
  • 2015-12-25
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
  • 2016-10-14
  • 2021-07-24
相关资源
最近更新 更多