在 React 中,如何从 Link 或其他组件添加 URL "string" 作为对象的 属性
In React, how to add a URL "string" as an object's property, from a Link or other component
在 React 中,我将一个对象的 URL 属性(具体来说,amcharts 图表 bullet.url)设置为“../members/{member.name}" 它呈现没有问题。单击 link 可正确导航到该页面。但是,似乎所有以前加载的状态都需要重新加载。它是新的 React "session?"
我试过使用 Link 使用各种表达式设置 属性。但是 none 似乎按预期编译。我发现的大多数文章都与 Link 或持久状态的基本用法有关。
以下工作呈现和导航,但所有状态都在新页面上消失:
let series = chart.series.push(new am4charts.LineSeries());
let bullet = series.bullets.push(new am4charts.CircleBullet());
bullet.url = "../Members/{member.name}";
我在想我缺少一个 React 概念或设置 link 的 URL 的简单方法。我想在没有 "resetting" 所有以前加载的状态的情况下导航。
In response to my comment.
组件的状态始终是一个Javascript对象,并存储在主内存中。每个组件状态都在变化,直到页面刷新或关闭。之后,页面将以其初始状态进行初始化。
您可以使用 localStorage 或 cookie 来实现功能或混合。
Example
const Example = React.createClass({
getInitialState: function () {
return JSON.parse(localStorage.getItem('counter') || '{}');
},
componentDidMount: function () {
let self = this;
setInterval(function () {
this.setState({
ticks: this.state.ticks + 1 // Increment
});
localStorage.setItem('counter', JSON.stringify(this.state)); // Store
}, 1000); // Interval
},
render: function () {
return (
<span>{this.state.ticks}</span>
);
}
});
Link Variable
// "../Members/{member.name}";
// Make sure member.name is not an object, but a string
<a href={ `#/..Members/${members.name}` }>{members.name}</a>
Why do you have an error?
Type.js:171 未捕获错误:应为字符串或数字但得到了 [object Function]
这是因为您正在访问一个作为函数的对象值。你需要一个字符串。如果不是字符串转换 it Object.toString();
.
// You are not accessing the object correctly
const param = {
id: function() {
// This is what it's seeing
},
// Needs to be
id: '../members/id'
}
console.log(param.id);
bullet.url = `'../Members/${member.name}'`;
以这种方式在对象中添加 from to url
不使用 url
s,而是使用点击 ("hit"
) 事件来留在 React 生态系统中。如果您允许图表组件通过 React Router 呈现并使用 withRouter
导出它,您可以在组件本身上利用 this.props.history
。至于如何处理成员的名字,假设bullet
实际上是其他项目符号的模板,我个人认为成员的名字应该是图表数据的一部分。例如
主要成分:
import React, { Component } from "react";
import ReactDOM from "react-dom";
import { Route, BrowserRouter as Router } from "react-router-dom";
// ...
// main component's render
<Router>
<React.Fragment>
<Route
path="/"
render={props => <App {...props} />}
/>
<Route
path="/Member/:name"
render={props => <Person {...props} extra="via router" />}
/>
</React.Fragment>
</Router>
包含您的图表的组件(例如 App):
import React from "react";
import { withRouter } from "react-router-dom";
import * as am4core from "@amcharts/amcharts4/core";
import * as am4charts from "@amcharts/amcharts4/charts";
import am4themes_animated from "@amcharts/amcharts4/themes/animated";
// App's componentDidMount() ...
// ...chart code...
// Member names found in bullet data
chart.data = [ { name: "...", /* ... */ }, /* ... */ ];
// Since we're not using `url`, manually change the cursor to a pointer on hover
bullet.cursorOverStyle = am4core.MouseCursorStyle.pointer;
// Bullet click event
bullet.events.on("hit", event => {
this.props.history.push('../Members/' + event.target.dataItem.dataContext.name);
});
// ... end App
export default withRouter(App);
这是我们 Column charts with images at top demo 在 React 中的一个分支,当单击 bullet/images 时,既会更新主要组件的状态,也会转到新的 URL,并且都会加载人物信息:
https://codesandbox.io/s/olpzok2rxz
如果 member.name
不是图表数据的一部分而且也不可能是,那么无论是在 JSFiddle 还是 CodeSandbox 上提供您的应用程序示例都会有所帮助,以便我们进一步提供帮助。
在 React 中,我将一个对象的 URL 属性(具体来说,amcharts 图表 bullet.url)设置为“../members/{member.name}" 它呈现没有问题。单击 link 可正确导航到该页面。但是,似乎所有以前加载的状态都需要重新加载。它是新的 React "session?"
我试过使用 Link 使用各种表达式设置 属性。但是 none 似乎按预期编译。我发现的大多数文章都与 Link 或持久状态的基本用法有关。
以下工作呈现和导航,但所有状态都在新页面上消失:
let series = chart.series.push(new am4charts.LineSeries());
let bullet = series.bullets.push(new am4charts.CircleBullet());
bullet.url = "../Members/{member.name}";
我在想我缺少一个 React 概念或设置 link 的 URL 的简单方法。我想在没有 "resetting" 所有以前加载的状态的情况下导航。
In response to my comment.
组件的状态始终是一个Javascript对象,并存储在主内存中。每个组件状态都在变化,直到页面刷新或关闭。之后,页面将以其初始状态进行初始化。
您可以使用 localStorage 或 cookie 来实现功能或混合。
Example
const Example = React.createClass({
getInitialState: function () {
return JSON.parse(localStorage.getItem('counter') || '{}');
},
componentDidMount: function () {
let self = this;
setInterval(function () {
this.setState({
ticks: this.state.ticks + 1 // Increment
});
localStorage.setItem('counter', JSON.stringify(this.state)); // Store
}, 1000); // Interval
},
render: function () {
return (
<span>{this.state.ticks}</span>
);
}
});
Link Variable
// "../Members/{member.name}";
// Make sure member.name is not an object, but a string
<a href={ `#/..Members/${members.name}` }>{members.name}</a>
Why do you have an error?
Type.js:171 未捕获错误:应为字符串或数字但得到了 [object Function]
这是因为您正在访问一个作为函数的对象值。你需要一个字符串。如果不是字符串转换 it Object.toString();
.
// You are not accessing the object correctly
const param = {
id: function() {
// This is what it's seeing
},
// Needs to be
id: '../members/id'
}
console.log(param.id);
bullet.url = `'../Members/${member.name}'`;
以这种方式在对象中添加 from to url
不使用 url
s,而是使用点击 ("hit"
) 事件来留在 React 生态系统中。如果您允许图表组件通过 React Router 呈现并使用 withRouter
导出它,您可以在组件本身上利用 this.props.history
。至于如何处理成员的名字,假设bullet
实际上是其他项目符号的模板,我个人认为成员的名字应该是图表数据的一部分。例如
主要成分:
import React, { Component } from "react";
import ReactDOM from "react-dom";
import { Route, BrowserRouter as Router } from "react-router-dom";
// ...
// main component's render
<Router>
<React.Fragment>
<Route
path="/"
render={props => <App {...props} />}
/>
<Route
path="/Member/:name"
render={props => <Person {...props} extra="via router" />}
/>
</React.Fragment>
</Router>
包含您的图表的组件(例如 App):
import React from "react";
import { withRouter } from "react-router-dom";
import * as am4core from "@amcharts/amcharts4/core";
import * as am4charts from "@amcharts/amcharts4/charts";
import am4themes_animated from "@amcharts/amcharts4/themes/animated";
// App's componentDidMount() ...
// ...chart code...
// Member names found in bullet data
chart.data = [ { name: "...", /* ... */ }, /* ... */ ];
// Since we're not using `url`, manually change the cursor to a pointer on hover
bullet.cursorOverStyle = am4core.MouseCursorStyle.pointer;
// Bullet click event
bullet.events.on("hit", event => {
this.props.history.push('../Members/' + event.target.dataItem.dataContext.name);
});
// ... end App
export default withRouter(App);
这是我们 Column charts with images at top demo 在 React 中的一个分支,当单击 bullet/images 时,既会更新主要组件的状态,也会转到新的 URL,并且都会加载人物信息:
https://codesandbox.io/s/olpzok2rxz
如果 member.name
不是图表数据的一部分而且也不可能是,那么无论是在 JSFiddle 还是 CodeSandbox 上提供您的应用程序示例都会有所帮助,以便我们进一步提供帮助。