javascript - 更新 TradingView Hotlist 小部件 onChange
问题描述
下面是我用于启动小部件的组件,我想在从选择标签中选择新值时更改交换。onChange 更改状态值,但小部件不会更改它正在查看的值。任何想法如何使它工作?
import React from "react";
export default class StockGainer extends React.PureComponent {
constructor(props) {
super(props);
this._ref = React.createRef();
this.state = {
exchange:
"TSX"
}
}
componentDidMount() {
const script = document.createElement('script');
script.src = 'https://s3.tradingview.com/external-embedding/embed-widget-hotlists.js'
script.async = true;
this._ref.current.appendChild(script);
script.innerHTML = JSON.stringify(
{
"colorTheme": "dark",
"dateRange": "12M",
"exchange": `${this.state.exchange}`,
"showChart": true,
"locale": "en"
})
}
render() {
const Changeexchange = (e) => {
this.setState({exchange: e.target.value})
}
const SelectBox = () => (
<div class="select-div">
<select className="exchange" value={this.state.exchange} name="pagination" onChange={Changeexchange}>
<option value="US"> USA (US Exchanges)</option>
<option value="NASDAQ"> USA (NASDAQ)</option>
<option value="NYSE"> USA (NYSE)</option>
<option value="AMEX"> USA (NYSE ARCA)</option>
<option value="OTC"> USA (OTC) </option>
</select>
</div>
)
return(
<div class="tradingview-widget-container" ref={this._ref}>
<div style={{position:"absolute", top: "0px", left:"318px"}}>{SelectBox()}</div>
<div class="tradingview-widget-container__widget"> </div>
{console.log(this.state.exchange)}
</div>
);
}
}
解决方案
改变状态的交换是不够的,如果你想更新小部件,你需要再次创建整个脚本标签。您可以创建函数“updateWidget”并在 componentDidMount 和 changeExhange 函数中调用它。
我还为小部件tradingView创建了新的 div ,我们需要在每次更新小部件时使用 innerHTML='' 清除它。否则每次我们更改交换时它都会创建多个小部件。
import React from "react";
export default class StockGainer extends React.PureComponent {
constructor(props) {
super(props);
this._ref = React.createRef();
this.state = {
exchange:
"TSX"
}
}
componentDidMount() {
this.updateWidget()
}
updateWidget(){
this._ref.current.innerHTML=''
const script = document.createElement('script');
script.src = 'https://s3.tradingview.com/external-embedding/embed-widget-hotlists.js'
script.async = true;
this._ref.current.appendChild(script);
script.innerHTML = JSON.stringify(
{
"colorTheme": "dark",
"dateRange": "12M",
"exchange": `${this.state.exchange}`,
"showChart": true,
"locale": "en"
})
}
render() {
const Changeexchange = (e) => {
this.setState({exchange: e.target.value})
this.updateWidget()
}
const SelectBox = () => (
<div class="select-div">
<select className="exchange" value={this.state.exchange} name="pagination" onChange={Changeexchange}>
<option value="US"> USA (US Exchanges)</option>
<option value="NASDAQ"> USA (NASDAQ)</option>
<option value="NYSE"> USA (NYSE)</option>
<option value="AMEX"> USA (NYSE ARCA)</option>
<option value="OTC"> USA (OTC) </option>
</select>
</div>
)
return(
<div class="tradingview-widget-container" >
<div style={{position:"absolute", top: "0px", left:"318px"}}>{SelectBox()}</div>
<div ref={this._ref} id='tradingView'></div>
<div class="tradingview-widget-container__widget"> </div>
{console.log(this.state.exchange)}
</div>
);
}
}
推荐阅读
- google-sheets - 带有标签而不是数字的 Google 电子表格 GeoChart
- java - 使用java中的for每个循环打印类成员,其实例存储在Class类型的LinkedList中
- python - 从终端获取输出并将其写入文件 FileNotFoundError: [Errno 2] No such file or directory error found in python
- ios - 操纵杆的额外半圆线
- apache-nifi - 如何在 Apache Druid 中将嵌套数据转换为扁平数据
- spring - 为什么在实现基本身份验证时需要身份验证提供程序?春季安全
- html - 徽标图像未推到导航的左上角
- asp.net-mvc-5 - 如何在 module-zero-template 中为 Web api 自定义 OAuthBearerAuthentication
- java - 如果 outputStream.close() 失败,流仍然会被关闭,系统资源仍然会被释放?
- python - tkinter 笔记本小部件框架限制