【问题标题】:React Native: building a layout from data in an arrayReact Native:从数组中的数据构建布局
【发布时间】:2017-03-29 10:46:28
【问题描述】:

所以我在屏幕上有一个布局,它会多次复制自己。我真的很想把它清理干净。目前是这样的:

import { content } from '../content.js';

class Display extends Component {
  render() {
    return (
      <View style={styles.displayContainer}>
        <ScrollView>
          <View style={styles.row}>

            <View style={styles.displayItemBlock}>
              <TouchableOpacity style={styles.displayItem} onPress={this.item1}>
                <Image
                  style={styles.displayItemImage}
                  source={require('../images/display-item1.jpg')}
                />
                <View style={styles.displayItemText}>
                  <Text style={styles.displayItemTitle}>{content.display_title_item1}</Text>
                  <Text style={styles.recipeItemTime}>
                    <IconMCI name="clock" color="#4F8EF7" /> 2h 30m
                  </Text>
                </View>
              </TouchableOpacity>
            </View>
            <View style={styles.displayItemBlock}>
              <TouchableOpacity style={styles.displayItem} onPress={this.item2}>
                <Image
                  style={styles.displayItemImage}
                  source={require('../images/display-item2.jpg')}
                />
                <View style={styles.displayItemText}>
                  <Text style={styles.displayItemTitle}>{content.display_title_item2}</Text>
                  <Text style={styles.recipeItemTime}>
                    <IconMCI name="clock" color="#4F8EF7" /> 45m
                  </Text>
                </View>
              </TouchableOpacity>
            </View>
           {/* AND REPEAT... */}

          </View>
        </ScrollView>
      </View>
    );
  }
}

所以我想我可以很容易地用地图替换其中的大部分内容,该地图将获取发生变化的信息并将其放入数组中。所以现在我有了这个:

import { content } from '../content.js';

const dataArray = [
  { img: '../images/display-item1.jpg',
    title: 'content.display_title_item1',
    func: 'item1',
    time: '2h 30m' },
  { img: '../images/display-item2.jpg',
    title: 'content.display_title_item2',
    func: 'item2',
    time: '45m' },
];

class Display extends Component {

  ShowEverything() {
    return dataArray.map(function (data, i) {
      return (
        <View key={i} style={styles.displayItemBlock}>
          <TouchableOpacity style={styles.displayItem} onPress={this.{data.func}}>
            <Image
              style={styles.displayItemImage}
              source={require({data.img)}
            />
            <View style={styles.displayItemText}>
              <Text style={styles.displaytemTitle}>{data.title}</Text>
              <Text style={styles.displayItemTime}>
                <IconMCI name="clock" color="#4F8EF7" /> {data.time}
              </Text>
            </View>
          </TouchableOpacity>
        </View>
      );
    });
  }  

  render() {
    return (
      <View style={styles.displayContainer}>
        <ScrollView>
          <View style={styles.row}>

            {this.ShowEverything()}

          </View>
        </Scroll>
      </View>
    );
  }
}

还有什么比这更容易的,对吧? :)

这当然行不通。时间 (data.time) 输出正确,但标题没有从 content.js 中提取正确的文本(它只是从数组中输出字符串 content.display_title_item)。 imgfunc 项目也无法正常工作。

我离这儿很远吗?看起来这是保持 DRY 的最明显方法;任何帮助,将不胜感激。

【问题讨论】:

    标签: arrays react-native react-jsx


    【解决方案1】:

    试试这个

    import { content } from '../content.js';
    
    const dataArray = [
      { img: require('../images/display-item1.jpg'), //this is a known issue in react, dynamic paths needs to assigned like this
        title: 'display_title_item1',
        func: 'item1',
        time: '2h 30m' },
      { img: require('../images/display-item2.jpg'),
        title: 'display_title_item2',
        func: 'item2',
        time: '45m' },
    ];
    
    class Display extends Component {
    
      ShowEverything() {
        return dataArray.map((data, i) => { // changed to fat arrow func to be in scope of this
          return (
            <View key={i} style={styles.displayItemBlock}>
              <TouchableOpacity style={styles.displayItem} onPress={this[data.func]}> // syntax error
                <Image
                  style={styles.displayItemImage}
                  source={data.img}
                />
                <View style={styles.displayItemText}>
                  <Text style={styles.displaytemTitle}>content[data.title]</Text> // syntax error
                  <Text style={styles.displayItemTime}>
                    <IconMCI name="clock" color="#4F8EF7" /> {data.time}
                  </Text>
                </View>
              </TouchableOpacity>
            </View>
          );
        });
      }  
    

    【讨论】:

    • 非常感谢 - 这已经非常成功了!非常感谢您的帮助,看到您的版本后,如何让它工作变得很清楚!
    猜你喜欢
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 2019-09-20
    • 1970-01-01
    相关资源
    最近更新 更多