美文网首页程序员
React Native实战开发12:编辑内容

React Native实战开发12:编辑内容

作者: Jeffrey_Hu | 来源:发表于2017-03-15 17:25 被阅读114次

    更新todo内容

    在之前的章节里,我们已经开发了一个小的todo app,我们可以增加、删除、完成/未完成 todo items,我们还开发了一个过滤器用于筛选不同状态的todo列表。今天我们将增加一个新功能,即编辑修改todo的内容。

    模块化编辑或者显示

    思路:我们给每个todo增加一个新的属性:editing,如果这个属性为true则表示正在编辑状态,反之则为非编辑状态。在编辑状态时我们显示一个编辑的模块,在非编辑状态时我们显示现有的模块,我们称之为"显示"模块。

    首先,我们将在row.js里,导入TextInput这个控件。

    import {View, Text, StyleSheet, Switch, TouchableOpacity, TextInput} from "react-native";
    

    将现有的todo内容和删除按钮模块化:

    const textComponent = (
      <View style={styles.textWrap}>
        <Text style={[styles.text, complete && styles.complete]}>{this.props.text}</Text>
      </TouchableOpacity>
    );
    
    const removeButton = (
      <TouchableOpacity onPress={this.props.onRemove}>
        <Text style={styles.remove}>X</Text>
      </TouchableOpacity>
    );
    

    然后,增加一个新的编辑状态的模块:

    const editingComponent = (
      <View style={styles.textWrap}>
        <TextInput
          autoFocus
          multiline
          value = {this.props.text}
          onChangeText = {this.props.onUpdate}
          style={styles.input}
        />
    
      </View>
    );
    

    增加处理方法

    我们需要有2个方法,一个用于处理update todo text,另一个用于处理切换编号和非编辑状态。在app.js里,我们增加这2个方法:

    handleUpdateText(key, text) {
      const newItems = this.state.items.map((item) =>{
        if (item.key !== key) return item;
        return {
          ...item,
          text
        }
      });
      this.setSource(newItems, filterItems(this.state.filter, newItems));
    }
    
    handleToggleEditing(key, editing) {
      const newItems = this.state.items.map((item) =>{
        if (item.key !== key) return item;
        return {
          ...item,
          editing
        }
      });
      this.setSource(newItems, filterItems(this.state.filter, newItems));
    }
    

    将2个处理方法传给Row组件

    和之前我们将handleComplete方法传给Row组件一样,我们将这2个新的处理方法传递给Row组件,同时不要忘记先将这2个新的方法bind(this)

    <Row
      key={key}
      onRemove = {() => this.handleRemoveItem(key)}
      onComplete = {(complete) => this.handleToggleComplete(key, complete)}
      onToggleEdit = {(editing) => this.handleToggleEditing(key, editing)}
      onUpdate = {(text) => this.handleUpdateText(key, text)}
      {...value}
    />
    

    切换编辑和非编辑状态

    回到row.js,我们需要给"显示"控件增加一个长按方法,当我长按这个todo的时候,表示我想编辑这个todo,我们需要将<View>换成<TouchableOpacity>

    const textComponent = (
      <TouchableOpacity style={styles.textWrap} onLongPress={() => this.props.onToggleEdit(true)} >
        <Text style={[styles.text, complete && styles.complete]}>{this.props.text}</Text>
      </TouchableOpacity>
    );
    

    现在我们运行一下app

    最后,我们需要在编辑状态时增加一个按钮,切换回非编辑状态,增加一个doneButton控件:

    const doneButton = (
      <TouchableOpacity style={styles.done} onPress={() => this.props.onToggleEdit(false)}>
        <Text style={styles.doneText}>Save</Text>
      </TouchableOpacity>
    );
    

    在Row的render方法里,我们使用this.props.editing来判断是显示编辑状态还是非编辑状态。

    {this.props.editing ? editingComponent : textComponent}
    {this.props.editing ? doneButton : removeButton}
    

    以下为最终的运行结果

    今日代码:
    https://github.com/zhiwehu/todo/tree/editing

    相关文章

      网友评论

        本文标题:React Native实战开发12:编辑内容

        本文链接:https://www.haomeiwen.com/subject/rpfrnttx.html