如何使 Meteor React 内联 svg 元素单击页面链接而不刷新整个页面

Posted

技术标签:

【中文标题】如何使 Meteor React 内联 svg 元素单击页面链接而不刷新整个页面【英文标题】:How to make Meteor React inline svg element click link to page without refresh whole page 【发布时间】:2017-01-01 13:08:43 【问题描述】:

我需要一些指导。第一次来这里,所以可能我使用的一些“术语”很不寻常,请多多包涵。

我正在尝试实现 JSX 中的标题(使用 Meteor 平台)。目前,如果我在 svg 中使用 xlinkHref,当我单击元素时,它会打开链接,但会导致刷新整个页面。在 svg 之外(使用 href),它将打开链接而不刷新整个页面。代码示例:

import React,  Component  from 'react';

export default class App extends Component 

render() 
    return (
    <div>
        <svg>
            <a xlinkHref="/nextpage"> //clicking this will refresh whole page
            <circle cx="50" cy="50" r="40" fill="red" />
            </a>
            <circle cx="150" cy="50" r="40" fill="yellow" />
        </svg>
        <a href="/nextpage">Click to Next Page</a> //clicking this will not refresh
    </div>
    )

请注意,如果我将“a”标签包裹在 svg 标签之外,它肯定会起作用,但我只需要红色圆圈是可点击的。

我一直在考虑将圆形元素分解为单独的 svg,然后用“a”标签包装,但我只能说我无法做到这一点,我怎么能在不刷新整个页面的情况下仍然单击 svg 元素打开链接?

编辑:修正了一些代码错误

【问题讨论】:

【参考方案1】:

您可以在您的圈子上添加 onclick 事件处理程序。

export default class App extends Component 

  onCircleClick(event) 

    event.preventDefault();
    console.log('Inside on circle click');
    window.location='/nextpage';
  

 render() 
 return (
 <div>
   <h1> Testing svg tag </h1>
   <svg>
     <circle onClick= this.onCircleClick cx="50" cy="50" r="40" fill="red"/>
     <circle onClick= this.onCircleClick cx="150" cy="50" r="40" fill="yellow" />
   </svg>
</div>
);


【讨论】:

嗨。你的解决方案对我不起作用。它将打开链接,但仍会刷新整个页面。我也测试了 svg 标签外的“onClick”属性,结果与上面相同。好像 event.preventDefault() 没有触发? 我认为您需要将点击处理程序绑定到组件,如下所示; this.onCircleClick.bind(this). 也试过了,添加 bind(this) 也不能如我所愿。 @tsega【参考方案2】:

使用 React 路由器

通过使用 React Router 中的 browserHistory,您将能够在不刷新整个页面的情况下打开链接。

import React,  Component  from 'react';
import  browserHistory  from 'react-router';


export default class App extends Component 

  handleClick(link) 
    browserHistory.push(link);
  

  render() 
    return (
      <div>
        <svg>
          <a onClick=this.handleClick.bind(null, "/nextpage")>
            <circle cx="50" cy="50" r="40" fill="red" />
          </a>
        </svg>
      </div>
    )
  


browserHistory 在可用时使用 html5 History API,否则回退到完全刷新。 browserHistory 需要在服务器端进行额外配置才能提供 URL,但它是现代网页的普遍首选解决方案。

更多关于 React Router 的 API: https://github.com/ReactTraining/react-router/blob/master/docs/API.md#browserhistory


使用 history.pushState()

如果你不能使用 React Router,你仍然可以使用 HTML5 的 API pushstate 来改变路由:https://developer.mozilla.org/en-US/docs/Web/API/History_API

history.pushState(name, title, "nextpage");

请注意,历史记录与旧浏览器不兼容:http://caniuse.com/#search=history


配备 Meteor 路由器

应该可以使用history.pushState()。如果不是,路由器应该具有与 React Router 相同的 pushState 等价物。

【讨论】:

以上是关于如何使 Meteor React 内联 svg 元素单击页面链接而不刷新整个页面的主要内容,如果未能解决你的问题,请参考以下文章

如何使用内联 带有webpack的React应用程序中的标签

在 React 中用内联 svg 替换图像元素

如何动态导入 SVG 并内联渲染

如何使用 webpack 设置内联 svg

如何从 Web 服务动态导入 SVG 并内联渲染

使用 Bootstrap 的响应式内联 SVG