假设我有一个SVG元素,其中包含所有美国州的路径.
<svg>
<g id="nh">
<title>New Hampshire</title>
<path d="m 880.79902,142.42476 0.869,-1.0765 1.09022,..." id="NH" class="state nh" />
</g>
...
</svg>
Run Code Online (Sandbox Code Playgroud)
SVG数据保存在带.svg扩展名的单独文件中.假设我想创建该映射的React组件,并完全控制它,以便我可以根据一些外部输入修改各个状态的样式.
使用Webpack,据我所知,我有两个加载SVG标记的选项:使用raw-loader将其作为原始标记插入并使用以下命令创建组件dangerouslySetInnerHTML:
var InlineSvg = React.createClass({
render() {
var svg = require('./' + this.props.name + '.svg');
return <div dangerouslySetInnerHTML={{__html: svg}}></div>;
}
});
Run Code Online (Sandbox Code Playgroud)
或手动将标记转换为有效的JSX:
var NewComponent = React.createClass({
render: function() {
return (
<svg>
<g id="nh">
<title>New Hampshire</title>
<path d="m 880.79902,142.42476 0.869,-1.0765 1.09022,..." id="NH" className="state nh" />
</g>
...
</svg>
);
});
Run Code Online (Sandbox Code Playgroud)
最后,让我们说除了SVG地图之外,还有一个包含所有状态的简单HTML列表.每当用户将鼠标悬停在列表项上时,相应的SVG路径应该移动填充颜色.
现在,我似乎无法弄清楚如何更新React SVG组件以反映悬停状态.当然,我可以进入DOM,通过类名选择SVG状态并更改其颜色,但这似乎不是"反应"方式.一个手指将非常感激.
PS.我正在使用Redux来处理组件之间的所有通信.
你需要做两件事:
1) 在每个列表项上设置一个事件侦听器,以通知您的应用程序突出显示的项。
<li
onMouseOver={() => this.handleHover('NH')}
onMouseOut={() => this.handleUnhover()}
>
New Hampshire
</li>
Run Code Online (Sandbox Code Playgroud)
2) 捕获数据,并将其传播到您的 SVG 组件。
这是更复杂的部分,它取决于您如何构建应用程序。
handleHover只需更新组件状态handleHover触发作为 prop 传入的回调我们假设是后者。组件方法可能如下所示:
handleHover(territory) {
this.props.onHighlight(territory);
}
handleUnhover() {
this.props.onHighlight(null);
}
Run Code Online (Sandbox Code Playgroud)
假设您有一个父组件,其中包含 SVG 地图和列表,它可能看起来像这样:
class MapWrapper extends React.Component {
constructor(props) {
super(props);
this.state = {
highlighted: null;
};
}
setHighlight(territory) {
this.setState({
highlighted: territory
});
}
render() {
const highlighted = { this.state };
return (
<div>
<MapDiagram highlighted={highlighted} />
<TerritoryList onHighlight={(terr) => this.setHighlight(terr)} />
</div>
);
}
}
Run Code Online (Sandbox Code Playgroud)
这里的关键是highlighted状态变量。每次发生新的悬停事件时,highlighted值都会发生变化。此更改会触发重新渲染,并将新值传递给它MapDiagram,然后可以确定要突出显示 SVG 的哪一部分。
| 归档时间: |
|
| 查看次数: |
3731 次 |
| 最近记录: |