React Native - parentElement.props.children = undefined

时间:2018-02-05 08:48:22

标签: reactjs react-native jsx

我正在为自己开发一个学校管理应用程序。 我班上的所有学生都被列在一个Flatlist中,旁边有他们父母的电话号码,这样我就可以在学生不在时给他们发短信。

我有一个带有Listitems的 FlatList ,每个Listitems都包含一个内置 Text 子元素的Touchopacity组件。

成功将短信发送给学生的父母(smsParent方法)后,我想在 TouchOpacity 及其 Text 子项(操纵他们的样式道具)上设置NativeProps。我使用ref =(()=> ...)来引用 Touchopacity ,然后 this.props.children (只有1个孩子)来到它的 Text 孩子。

然而,我不能使用setNativeProps(= undefined)。 但是,当我在 Text 上使用ref =(()=> ...)然后引用它时,setNativeProps在其父/的情况下工作/喜欢。

为什么我不能在childEl.props.children引用它时对孩子使用setNativeProps()?(只有1个孩子,在调试器中检查,它已被正确识别)

请阅读smsParent方法中的评论

/ *抱歉插入一个片段 - 代码插入是疯狂格式化的

/ **代码简化/

class SingleClassPage extends Component {

  buttons = new Array();

  constructor(props) {
    super(props);
    this.state = { students: [] };
    this.smsParent = this.smsParent.bind(this);
  }


  componentDidMount() {
    //fetch students from api and setState..
    this._getStudentsList();
  }

  _getStudentsList() {
    // ...
  }

  //flatlist item
  ListEl(props) {
    return (
      <View>
        <TouchableOpacity ref={el => { let a = props.item.attId + 'att'; props.buttons[a] = el; }}
          style={[styles.buttonDef, (props.item.phone_parent ? styles.buttonBlue : styles.buttonGray)]}
          onPress={() => { props.smsSendHandler(props.item, 'attendance', a) }}>
          <Text style={props.item.phone_parent ? styles.buttonTextLight : styles.buttonTextDark}>
            {props.item.smsAttSent ? 'sms sent' : 'sms send'}
          </Text>
        </TouchableOpacity>
      </View>
    )
  }

  render() {
    return (
      <View style={{ flex: 1, }}>
        <FlatList
          data={this.state.students}
          extraData={this.state}
          keyExtractor={item => item.attId}
          renderItem={({ item }) => <this.ListEl buttons={this.buttons} item={item} smsSendHandler={this.smsParent} />}
        />
        <BusyIndicator />
      </View>
    );
  }


  smsParent(student, msgCategory, smsButton) {

    //call myjava module and upon successful callback call below:

    let parEl = this.buttons[smsButton];
    //childEl is an object with props.children set to text 'sms sent/send' when I watch its value in debugger
    //so it's correctly identified
    let childEl = parEl.props.children;

    // WORKS 
    parEl.setNativeProps({ style: { backgroundColor: 'green' } });
    // OOPS
    childEl.setNativeProps({ style: { color: 'black' } });
  }
}

EDIT1 发布错误的屏幕截图(也作为对下面Dyo建议的回应 - 同样的错误Dyo ......)

enter image description here

1 个答案:

答案 0 :(得分:0)

我认为你必须遍历孩子才能传递给他们nativeProps(即使只有一个孩子):

import urllib.request

def dl_jpg(url, file_path, file_name):
    full_path = file_path + file_name + ".jpg"
    urllib.request.urlretrieve(url, full_path)

url = input("Enter img URL to download:")
file_name = input("Enter file name to save as:")

def _new_folder(dir_name):
    if not os.path.exists(dir_name):
        os.makedirs(dir_name)
    return

_new_folder(images)

dl_jpg(url, "images/", file_name)