ReactNative警告:bind(): React component methods may only be bound to the component instance

本人只粗略了解标签语言,至于html5,js,css啥的完全外行。我认为ReactNative是移动App开发的趋势,作为一个iOS开发工程师,深知原生开发的局限性,从今天起,像个孩子一样学习RN。使用教材《React Native入门与实践》

在学习第6章二级菜单组件时,报了个警告

bind(): React component methods may only be bound to the component instance
 <Text onPress={this.props.click.bind(this,data[i][k][j])} style={[styles.left_row]} key={i+'_'+j+'_'+k}>{data[i][k][j]}</Text>

将bind()函数里的this改为null

 <Text onPress={this.props.click.bind(null,data[i][k][j])} style={[styles.left_row]} key={i+'_'+j+'_'+k}>{data[i][k][j]}</Text>

详细参考
http://facebook.github.io/react/blog/2013/07/02/react-v0-4-autobind-by-default.html

整体代码如下

var data = {
  "全部区域":{
    "全部区域":["全部区域"],
    "热门商圈":[
      "虹桥地区",
      "徐家汇地区",
      "淮海路商业区",
    ],
    "热门行政区":[
      "静安区",
      "徐汇区",
      "长宁区",
    ],
  },
  "地铁沿线":{
    "地铁全线":["地铁全线"],
    "一号线":[
    "六号桥",
    "回龙观"],
    "二号线":[
    "六号桥一",
    "回龙观"],
  },
};


import React, {
  AppRegistry,
  ScrollView,
  StyleSheet,
  Text,
  View,
  TouchableOpacity,
} from 'react-native';


var prefixType = '_type_';
var prefixStyle = '_style_';
var defaultBackgroundColor = {backgroundColor:'#fff'};

var MenuList = React.createClass({



  getInitialState:function(){

    var data = this.props.data;
    var nSelected = this.props.nSelected;
    var tabSelected = this.props.tabSelected;
    var obj = {};
    var kIndex = 0;
    for(var k in data){
      var childData = data[k];
      var cIndex = 0;
      for(var c in childData){
        var type = prefixType+k+'_'+c;
        var style = prefixStyle+k+'_'+c;
        obj[type]=false;
        obj[style]={};
        if (nSelected === cIndex && tabSelected === kIndex) {
          obj[type] = true;
          obj[style] = defaultBackgroundColor;
        }
        cIndex++;
      }
      kIndex++;
    }
    obj.tabSelected = tabSelected;
    obj.nSelected = nSelected;

    return obj;
  },

  render:function(){

    var header = this.renderHeader();
    var left = this.renderLeft();
    var right = this.renderRight();

    return(
      <View  style={styles.container}>
      <View  style={[styles.row,styles.header]}>
        {header}
      </View>

      <View  style={[styles.row,styles.flex_1]}>

        <ScrollView  style={[styles.flex_1,styles.left_pannel]}>
          {left}
        </ScrollView>

       <ScrollView  style={[styles.flex_1,styles.right_pannel]}>
          {right}
        </ScrollView>
      </View>


      </View>

      );
  },

  //头部
  renderHeader:function(){
    var data = this.props.data;
    var tabSelected = this.state.tabSelected;
    var header = [];
    var tabIndex = 0;
    for(var i in data){
      var tabStyle = null;
      if (tabIndex === tabSelected) {
        tabStyle = [styles.header_text,styles.active_blue];
      }else{
        tabStyle = [styles.header_text];
      }
      header.push(
        <TouchableOpacity style = {[styles.flex_1,styles.center]}
         onPress={this.headerPress.bind(this,i)} key={i}>
          <Text  style={styles.tabStyle} key={i}>{i}</Text>
         </TouchableOpacity>
        );
      tabIndex++;
    }
    return header;
  },
   //左侧
  renderLeft:function(){
    var data = this.props.data;
    var tabSelected = this.state.tabSelected;
    var leftPannel = [];
    var index = 0;

    for(var i in data){
      if (index === tabSelected) {
        for(var k in data[i]){
          var style = this.state[prefixStyle+i+'_'+k];
          leftPannel.push(
            <Text onPress={this.leftPress.bind(this,i,k)} style={[styles.left_row,style]} key={i+'_'+k}>{k}</Text>
            );
        }
        break;

      }
      index++;

    }

    return leftPannel;
  },

    //右侧
  renderRight:function(){
    var data = this.props.data;
    var tabSelected = this.state.tabSelected;
    var nSelected = this.state.nSelected;
    var rightPannel = [];
    var index = 0;

    for(var i in data){

      if (tabSelected === index) {
        for(var k in data[i]){
          if (this.state[prefixType+i+'_'+k]) {
            for(var j in data[i][k]){
              rightPannel.push(
                <Text onPress={this.props.click.bind(null,data[i][k][j])}
                style={[styles.left_row]} key={i+'_'+j+'_'+k}>{data[i][k][j]}</Text>

                );
            }
            break;

          }
        }

      }



      index++;

    }

    return rightPannel;
  },

 headerPress:function(title){

  var data = this.props.data;
  var index = 0;
  for(var i in data){

    if (i === title) {
      this.setState({
        tabSelected:index,
      });
      var obj = {};
      var n = 0;
      for(var k in data[i]){
        if (n !== 0) {
          obj[prefixType+i+'_'+k] = false;
          obj[prefixStyle+i+'_'+k] = {};
        }else{
           obj[prefixType+i+'_'+k] = true;
           obj[prefixStyle+i+'_'+k] = defaultBackgroundColor;         
        }
        n++;
      }
      this.setState(obj);
    }

    index++;

  }

 },


 leftPress:function(tabIndex,nIndex){
    var obj = {};
    for(var k in this.state){
      //全部置为false
      if (k.indexOf(prefixType) > -1) {
        var obj = {};
        obj[k] = false;
        this.setState(obj);
      }

      if (k.indexOf(prefixStyle) > -1) {
        var obj = {};
        obj[k] = {}
      };
      this.setState(obj);
    }

      obj[prefixType+tabIndex+'_'+nIndex] = true;
      obj[prefixStyle+tabIndex+'_'+nIndex] = defaultBackgroundColor;
      this.setState(obj);


  },


});


var styles = StyleSheet.create({
  container: {

    height:240,
    flex:1,
    borderTopWidth:1,
    borderBottomWidth:1,
    borderColor:'#ddd',

  },

  row:{
    flexDirection:'row',
  },

  flex_1:{
    flex:1,
  },
  header:{
    height:35,
    borderBottomWidth:1,
    borderColor:'#DFDFDF',
    backgroundColor:'#F5F5F5',

  },
  header_text:{
    color:'#7B7B7B',
    fontSize:15,
  },
  center:{
    justifyContent:'center',
    alignItems:'center',

  },
  left_pannel:{
    backgroundColor:'#F2F2F2'
  },
  left_row:{
    height:30,
    lineHeight:20,
    fontSize:14,
    color:'#7C7C7C',
  },
  right_pannel:{
    marginLeft:10,
  },
  active_blue:{
    backgroundColor:'#00B7EB',
  },
  active_fff:{
    backgroundColor:'#fff',
  }

});

var App = React.createClass({
  render:function(){
    return(
      <View style = {{marginTop:25}}>

      <MenuList data={data} nSelected={1} tabSelected={0} click={this.onPress}/>
      </View>
      );
  },
  onPress:function(val){
    alert(val);
  }
});

AppRegistry.registerComponent('Chapter6Code', () => App);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值