在React中,如何从链接或其他组件添加URL“string”作为对象的属性

问题描述 投票:4回答:3

在React中,我将对象的URL属性(具体来说,amcharts chart bullet.url)设置为“../members/ {member.name}”,它是一个字符串。它呈现没有问题。单击该链接可正确导航到该页面。但是,似乎所有以前加载的状态都需要重新加载。这是一个新的React“会话吗?”

我已经尝试使用链接使用各种表达式设置属性。但似乎没有按预期编译。我发现的大多数文章都与Link或持久状态的基本用法有关。

以下工作呈现和导航,但所有状态都在新页面上消失:

let series = chart.series.push(new am4charts.LineSeries());
let bullet = series.bullets.push(new am4charts.CircleBullet());
bullet.url = "../Members/{member.name}";

我在想有一个我想念的React概念或者设置链接URL的简单方法。我想在没有“重置”所有先前加载的状态的情况下导航。

javascript reactjs amcharts amcharts4
3个回答
1
投票

而不是使用urls,使用点击("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);

这是我们在React中的Column charts with images at top demo的一个分支,当点击项目符号/图像时,它们都会更新主要组件的状态以及转到一个新的URL,并且都加载了该人的信息:

https://codesandbox.io/s/olpzok2rxz

如果member.name不是图表数据的一部分而且不可能,那么无论是在JSFiddle还是CodeSandbox上,都可以获得应用样本,这样我们就可以进一步提供帮助。


0
投票
bullet.url = `'../Members/${member.name}'`;

在object to url中添加这种方式


0
投票

回应我的评论。

组件的状态始终是Javascript对象,并存储在主存储器中。每个组件状态都在变异,直到页面刷新或关闭。之后,页面将以其初始状态进行初始化。

您可以使用localStorage或cookie来实现功能或混合。

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>
    );
    }
});

链接变量

// "../Members/{member.name}";
// Make sure member.name is not an object, but a string
<a href={ `#/..Members/${members.name}` }>{members.name}</a>

你为什么有错误?

Type.js:171未捕获错误:预期字符串或数字但得到[对象功能]

这是因为您正在访问作为函数的对象值。你需要一个字符串。如果它不是字符串转换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);
© www.soinside.com 2019 - 2024. All rights reserved.