D3.js 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

在React Native中,我使用d3和艺术库绘制图表

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(){
返回(
)
}