plotly / plotly/react-plotly.js
uirevision not preserving the trace's visibility (legend click)
還沒有人認領這個 Issue。
- 主要語言
- JavaScript
- 星號
- 1.1k
- 分支
- 138
- 平均合併
- 3 天 2 小時
- 30 天內合併 PR
- 4
描述
When adding the below line to the layout [1], one would expect that the chart preserves the trace's visibility even after the data is reload, or other elements of a webapp change.
Whilst it works nice and clean in a simple test, in an almost empty react project, it doesn't seem to work well in a medium sized app, with dozens of Components and states.
In my specific example, it is enough for someone to change the navigation bar dropdowns, which trigger an event changing the state of App.js, where the charts originate, too. In the very same second when the dropdown changes its value, the charts lose their 'memory' of what was previously selected, and revert back to their original state.
I'll see if I can reproduce this in a sharable code-pen, but perhaps someone already encountered this issue?
Am using react-plotly 2.4.0 with plotly.js 1.48.0
**1**
uirevision: 'true'
Was able to recreate it. ui revision seems to be failing when callbacks are used in reacts setState.
Clicking 'Button2' twice, will reset the selected traces to their default. Simply removing the callback (which does not affect the plot) makes it behave as intended again.
import React, { Component } from 'react';
import './App.css';
import MyPlot from "./plotly_test";
import NavbarTop from "./NavbarTop";
class App extends Component {
constructor() {
super();
this.onClickButton = this.onClickButton.bind(this);
this.onClickButton2 = this.onClickButton2.bind(this);
this.state = {
myID: 1,
countries: {names: ['Alal', 'lqwel', 'qpweok'], labels: ['loqwe', 'qwoel', 'qlweo']},
country: 'Poland',
}
};
onClickButton() {
this.setState({myID: this.state.myID + 1})
this.changeCountry = this.changeCountry.bind(this);
var labels = this.state.countries.labels
this.setState({
labels: labels.push('SomeLabel')
})
}
onClickButton2() {
this.setState({
country: "SomeCountry",
}, ()=>{
this.setState({
country: 'Yet Another'
})
})
}
changeCountry = (value, callback) => {
this.setState({
country: value,
}, () => {
callback(value)
})
};
getCharts() {
let components = [];
components.push((<MyPlot id={this.state.myID}/>));
return components
}
render() {
let charts = this.getCharts();
return (
<div>
<h1>{this.state.country}</h1>
<NavbarTop callbackChange={this.changeCountry}/>
<div className="App">
{charts}
<button
onClick={this.onClickButton}
> Button1
</button>
<button
onClick={this.onClickButton2}
> Button2
</button>
</div>
</div>
)
}
}
export default App;
Navbar:
import React, { Component } from 'react';
class NavbarTop extends Component {
constructor(props) {
super(props);
this.handleChange = this.handleChange.bind(this);
}
handleChange(event) {
this.props.callbackChange(event.target.value, (something) => {
console.log(something);
})
}
render() {
return (
<div>
<nav>
<nav>
<select name="countries" id="countries"
onChange={this.handleChange} value={'PL'}>
<option value='DE'>Germany</option>
<option value='FR'>France</option>
<option value='ES'>Spain</option>
<option value='UK'>United Kingdom</option>
</select>
</nav>
</nav>
</div>
);
}
}
export default NavbarTop;
plotly_test:
import React, {Component} from 'react'
import Plot from 'react-plotly.js'
class MyPlot extends Component {
render() {
const rand = () => 1;
var x = [1, 2, 3, 4, 5];
const new_data = (trace) => Object.assign(trace, {y: x.map(rand)});
// add random data to three line traces
var data = [
{mode:'lines', line: {color: "#b55400"}},
{mode: 'lines', line: {color: "#393e46"}},
{mode: 'lines', line: {color: "#222831"}}
].map(new_data);
var layout = {
title: this.props.id,
uirevision:'true',
xaxis: {autorange: true},
yaxis: {autorange: true}
};
return (
<div>
<Plot
layout={layout}
data={data}
/>
</div>
);
}
}
export default MyPlot;
貢獻指南
這個儲存庫沒有索引到貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
研究方向
從提供的 App 元件以及 plotly_test 和 NavbarTop 元件開始,接著點擊圖例項目並觸發 Button2 基於 callback 的 setState 更新,以重現問題。追蹤 react-plotly.js 如何接收更新後的 Props,並找出 uirevision 為何不再保留可見性;當選取的 trace 可見性在這些更新後維持不變時,即表示完成。
由索引模型根據 Issue 內容生成。
評估
- 技術堆疊
- javascript, react
- 領域
- data-visualization, frontend
- Issue 類型
- 缺陷
- 難度
- 4/5
- 預估耗時
- 3-5 天
- 活躍度
- 停滯
- 描述清晰度
- 基本清楚
- 新手友好度
- 35/100