首页 > 在组件渲染之后,第一次触发事件不能正确的setState,之后却可以正常触发

在组件渲染之后,第一次触发事件不能正确的setState,之后却可以正常触发

下面是轮播图,图片盒子里组件。


    var ImgBox = React.createClass({
        componentDidMount: function(){
            console.log(typeof this.state.left);
        },
        getInitialState : function(){
            return {
                current:0 ,//当前下标,和left定位有直接关系
                disX: 0,
                startX: 0,
                left:"0"
            };
        },
        handleTouchStart : function(e){
            var offLeft = this.refs.imgBox.offsetLeft;
            console.log(offLeft);
            e.preventDefault();
            this.setState({
                startX: e.touches[0].pageX,
                disX: this.state.startX - offLeft,
                left: this.state.startX - this.state.left
            });
        },
        handleTouchMove : function(e){
            e.preventDefault();
            this.setState({
                left: e.touches[0].pageX - this.state.disX+"px"
            })
        },
        handleTouchEnd: function(e){
            if(e.changedTouches[0].pageX<this.state.startX){
                this.setState({current:this.state.current+1});
            }
            if(e.changedTouches[0].pageX>this.state.startX){
                this.setState({current:this.state.current-1});
            }
            this.setState({
                left:(this.state.current)*-1+"00%"
            })
        },
        render : function(){
            var styleObj = {
                left: this.state.left
            }
            var img = this.props.item.map(function(img,key){
                return(
                    <img src={img.src} alt = {img.alt} key={key} />
                    )
            })
            return (
                <div className="imgBox" style={styleObj} ref="imgBox" onTouchStart={this.handleTouchStart} onTouchMove={this.handleTouchMove} onTouchEnd={this.handleTouchEnd}>
                    {img}
                </div>
            )
        }
    });

在调试的时候,第二次触发事件后,会弹出一个warning.

Warning: div was passed a style object that has previously been mutated. Mutating style is deprecated. Consider cloning it beforehand. Check the render of ImgBox. Previous style: {left: NaN}. Mutated style: {left: NaN}.

跪求指导解决。


都定义ref了, 那就直接 操作dom的style吧,

难道正常思路不应该是这样的?


initialState里面,left初始值是个字符串

【热门文章】
【热门文章】