【发布时间】:2020-06-16 21:57:35
【问题描述】:
我有一个向客户端提供数据的 WebSocket,并且我正在使用 D3 反应在图表中显示它(数据),所以我希望我的图表根据数据进行更改,但要更改图表组件,我必须从定义 onMessage 事件的父组件访问它,我的问题是图表没有更新:
父组件:
class App extends Component {
constructor(props) {
super(props);
this.state = {
data: [],
};
}
handleData(data) {
let result = JSON.parse(data);
this.setState((state) => {
state.data.push(result.c.gas);
});
}
render() {
return (
<div>
<Websocket
url={`ws://${window.location.host}/ws/mqtt_app/1/`}
onMessage={this.handleData.bind(this)}
/>
<Chart data={this.state.data} />
</div>
);
}
}
子组件:
const Chart = (props) => {
const [data, setData] = useState(props.data);
const svgRef = useRef();
useEffect(() => {
// chart definition
}, [data]);
return (
<React.Fragment>
<svg ref={svgRef}>
<g className="x-axis"></g>
<g className="y-axis"></g>
</svg>
</React.Fragment>
);
};
export default Chart;
谢谢
【问题讨论】:
-
你试过
setState这样的this.setState((state, props) => ({ // code here })) -
试试
this.setState(state => ({ data: [...state.data, result.c.gas] })) -
成功了!!!谢谢:D @Mario !!!
-
@user9909204 原因是您必须通过分配一个新值来修改状态,在您的情况下,您正在改变它的值。您介意我在答案中发表评论并将其标记为正确吗?
-
@Mario 是的,请!
标签: javascript reactjs websocket react-d3