D3.js React Native中的d3缩放行为
在React Native中,我使用d3和艺术库绘制图表D3.js React Native中的d3缩放行为,d3.js,react-native,D3.js,React Native,在React Native中,我使用d3和艺术库绘制图表 export default class DevTest extends React.Component { static defaultProps = { width: 300, height: 150, } mainScaleX = d3Scale.scaleTime() .domain(d3Array.extent(chartDataTo, data =&g
export default class DevTest extends React.Component {
static defaultProps = {
width: 300,
height: 150,
}
mainScaleX = d3Scale.scaleTime()
.domain(d3Array.extent(chartDataTo, data => data.date))
.range([0, this.props.width])
mainScaleY = d3Scale.scaleLinear()
.domain(d3Array.extent(chartDataTo, data => data.value))
.range([this.props.height, 0])
rawChartValue = d3Shape.line()
.x(data => this.mainScaleX(data.date))
.y(data => this.mainScaleY(data.value))
render(){
return (
<View>
<Surface width = {this.props.width} height = {this.props.height}>
<Group x = {0} y = {0}>
<Shape
d = {this.rawChartValue(chartData)}
stroke = "#000"
strokeWidth = {1}
/>
</Group>
</Surface>
</View>
)
}
}
导出默认类DevTest扩展React.Component{
静态defaultProps={
宽度:300,
身高:150,
}
mainScaleX=d3Scale.scaleTime()
.domain(d3Array.extent(chartDataTo,data=>data.date))
.range([0,this.props.width])
mainScaleY=d3Scale.scaleLinear()
.domain(d3Array.extent(chartDataTo,data=>data.value))
.range([this.props.height,0])
rawChartValue=d3Shape.line()
.x(data=>this.mainScaleX(data.date))
.y(data=>this.mainScaleY(data.value))
render(){
返回(
)
}
}
是否有任何方法可以实现类似D3SVG的缩放行为,但不需要DOM变异。例如,使用一些仅具有x和y值的d3纯函数作为输入来重新缩放mainScaleX和mainScaleY?为此,您可以使用来自
react native的PanResponder
和来自d3 zoom的zoomIdentity
代码示例如下所示
componentWillMount() {
this._panResponder = PanResponder.create({
onMoveShouldSetPanResponder: (evt, gestureState) => true,
onPanResponderMove: (event, { dx, dy }) => {
const zoomIdentity = d3Zoom.zoomIdentity.translate(dx, dy)
this._onDrag(zoomIdentity)
},
});
}
_onDrag(zoomIdentity){
this.setState({
rescaledX: zoomIdentity.rescaleX(this.state.mainScaleX),
rescaledY: zoomIdentity.rescaleY(this.state.mainScaleY)
})
}
然后将重新缩放的{X,Y}传递给图表组件
render(){
return (
<View {...this._panResponder.panHandlers}>
<Component
{...this.props}
scaleX = {this.state.rescaledX}
scaleY = {this.state.rescaledY}
/>
</View>
)
}
render(){
返回(
)
}
为此,您可以使用react native
中的PanResponder
和d3 zoom
中的zoomIdentity
代码示例如下所示
componentWillMount() {
this._panResponder = PanResponder.create({
onMoveShouldSetPanResponder: (evt, gestureState) => true,
onPanResponderMove: (event, { dx, dy }) => {
const zoomIdentity = d3Zoom.zoomIdentity.translate(dx, dy)
this._onDrag(zoomIdentity)
},
});
}
_onDrag(zoomIdentity){
this.setState({
rescaledX: zoomIdentity.rescaleX(this.state.mainScaleX),
rescaledY: zoomIdentity.rescaleY(this.state.mainScaleY)
})
}
然后将重新缩放的{X,Y}传递给图表组件
render(){
return (
<View {...this._panResponder.panHandlers}>
<Component
{...this.props}
scaleX = {this.state.rescaledX}
scaleY = {this.state.rescaledY}
/>
</View>
)
}
render(){
返回(
)
}