【问题标题】:componentWillReceiveProps doesn't re-render the componentcomponentWillReceiveProps 不会重新渲染组件
【发布时间】:2018-03-04 19:13:14
【问题描述】:

这是我的子组件(SecondOrder)的代码。我正在尝试使用 d3js 和 reactjs 绘制一个甜甜圈。 componentWillReceiveProps 应该在获取新道具时重新渲染组件并设置其中提到的状态,对吗?但它在这里不能正常工作。它确实触发了,但状态仍然为空或未定义,当我尝试循环 this.state.selectedNode.connections 时出现错误,因为它仍然未定义。奇怪的是 if 也不起作用if(this.state.selectedNode !== 'undefined')!我添加了 console.log 行,当 this.state.selectedNode 未定义时,它只打印到控制台一次(这意味着我猜该组件没有重新渲染)!问题出在哪里?

export default class SecondOrder extends Component {
    constructor(props) {
        super(props);
        this.state = {
            nodes: [],
            selectedNode: null,
        };
    }

    componentWillReceiveProps(newProps){
        if (newProps.selectedNode !== this.props.selectedNode){
            this.setState({selectedNode:newProps.selectedNode})
        }

        if (newProps.nodes.length !== this.props.nodes.length){
            this.setState({nodes:newProps.nodes})
    }

    componentDidMount() {
        var width = 1000;
        var height = 500;
        var fullAngle = 2 * Math.PI;

        var svgContainer = select(".container")
            .append("svg")
            .attr("width", width)
            .attr("height", height)
            .style("border", "1px solid");

        var secondOrderList = [];
        if(this.state.selectedNode !== 'undefined'){
            console.log("************* ")
            this.state.selectedNode.connections.forEach(target => {
                console.log("target", target)
            });
        }

    }

    render() {
        return (
            <div>
                <div className="donut" ref={(donut) => { this.donut = donut; }} />
            </div>
            );
        }
    }

【问题讨论】:

  • 只要if(this.state.selectedNode){
  • 条件if(this.state.selectedNode !== 'undefined'){ 将始终评估为true,因为selectedNodenull
  • if(this.state.selectedNode !== 'undefined') -- 你的意思是if(typeof this.state.selectedNode !== 'undefined')吗?
  • @Prakashsharma 谢谢,这解决了 if 的奇怪行为。但是重新渲染问题仍然存在。 componentWillReceiveProps 不会重新渲染组件!
  • @Birish 改用componentDidUpdate 方法。

标签: reactjs d3.js


【解决方案1】:

componentDidMount 在初始渲染时只被调用一次。那时你的状态如下:

this.state = {
    nodes: [],
    selectedNode: null,
};

你得到新的 props 和 state,可能会更新,但没有方法响应更新(至少它不存在于提供的代码 sn-p 中)。

componentDidUpdate 可以解决问题

【讨论】:

  • 那我怎么能强迫它发生呢?问题是我需要在componentDidMount里面写d3js代码,还有什么地方可以加?!
猜你喜欢
  • 1970-01-01
  • 2020-02-13
  • 2020-04-18
  • 2018-09-01
  • 2019-10-05
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多