【问题标题】:How to prevent flatlist header or footer from re-render in reactnative如何防止平面列表页眉或页脚在本机反应中重新呈现
【发布时间】:2020-07-29 11:57:48
【问题描述】:

我在 flatlist 的页脚中放置了一个输入字段,但是当我尝试输入任何内容时,它会自动关闭键盘,因为 flatlist 页脚的重新呈现..

我试图从 Scrollview 嵌套平面列表,但这会带来警告..

如何阻止页脚重新渲染?我可以在不嵌套 Scrollview 的平面列表的情况下解决这个问题吗?

<FlatList
              ListHeaderComponent={() => (
                <View style={styles.discountContainer}>
                  <Text style={[styles.buttonText, { letterSpacing: 3 }]}>
                    10% DISCOUNT ON 8 COURSES
                  </Text>
                </View>
              )}
              numColumns={2}
              data={data}
              renderItem={({ item }) => (
                <View>
                  <SingleProduct item={item} />
                </View>
              )}
              ListFooterComponent={() => (
                <View>
                  <View style={styles.couponContainer}>
                    <Input
                      placeholder='Coupon code'
                      placeholderTextColor='#0a5796'
                      color='#0a5796'
                      inputStyle={{
                        color: '#0a5796',
                      }}
                      inputContainerStyle={{
                        borderBottomWidth: 0,
                        height: 50,
                      }}
                      containerStyle={styles.couponInputContainer}
                      onChangeText={(value) =>
                        this.setState({ couponCode: value })
                      }
                      value={this.state.couponCode}
                    />
                    {couponLoading ? (
                      <View style={styles.couponButton}>
                        <ActivityIndicator />
                      </View>
                    ) : (
                      <TouchableOpacity
                        style={styles.couponButton}
                        onPress={() => this.codeCheck(couponCode, line_items)}
                      >
                        <Text style={styles.buttonText}>Apply Coupon</Text>
                      </TouchableOpacity>
                    )}
                  </View>
                </View>
              )}
            />

【问题讨论】:

    标签: react-native footer react-native-flatlist rerender


    【解决方案1】:

    Arrow-Funktions“总是”执行并在内存中创建一个新的引用。这样,如果组件将被执行,它们将始终重新渲染。

    出于性能原因,您最好在外部定义您的函数并像这样调用它:

    function renderMyItem(){  ...bimbom... yous stuff goes here! }
    function renderHeader(){  ...bimbom... yous stuff goes here! }
    
    <Flatlist
      renderItem={this.renderMyItem()}
      ListHeaderComponent={this.renderHeader()}
      ...
    />
    
    

    这里发生了什么? 如果您的组件已加载,您的两个函数 renderMyItemrenderHeader 都将执行一次,并将保存在内存中。因此,每次调用其中一个函数时,都会调用对内存中保存它们的位置的引用。

    在另一种情况下,Arrow-Functions ()=&gt;{...} 在当前上下文中执行,并在每次调用时在内存中生成一个新引用,因为.. 说清楚:你 define &以这种方式调用函数。

    【讨论】:

    • 谢谢老兄,这让我很开心,我在这个问题上迷失了方向,很长一段时间都看不到这个问题。我一直使用不带括号的标题,现在我觉得很开明。
    • 欢迎 Erkan,很高兴这对您有帮助。
    【解决方案2】:

    我遇到了同样的问题,接受的答案对我不起作用。在这里出现问题是因为每当文本更改(如onChangeText 中定义)时我们都会更新状态,这会导致重新渲染。因此我想出了另一个解决方案;

    首先我创建了另一个与状态或道具无关的dict对象newState。所以在更改newState dict 时,不会导致重新渲染。然后;

    newState = {}
    
    <TextInput onChangeText={text => this.newState.value = text} />
    

    然后我在onEndEditing 上更改了状态(根据您的问题和我的问题,这是必要的);

    <TextInput onChangeText={text => this.newState.value = text} onEndEditing={this.setSearch} />
    

    这里是setSearch

    setSearch= () => {
        this.setState({couponCode: this.newState.value})
        delete this.newState.value;
    }
    

    设置状态后我正在删除密钥,因为它下次无法正确更新。

    【讨论】:

      【解决方案3】:

      如果您使用的是功能组件,则不要将箭头函数 () =&gt; (...) 用于 FlatList 的页眉和页脚组件,而是只返回您的页眉和页脚组件,如下面的示例所示。

      <FlatList
          ...
          ListHeaderComponent={(<View><Text>Header</Text></View>)}
          ListFooterComponent={(<View><Text>Footer<Text></View>)}
      />
      

      【讨论】:

      • 为我工作!非常感谢。
      • @Abbas.moosavi 很高兴它帮助了你!
      • 天啊!几个小时后,我找到了适合我的答案。非常感谢!
      • @QuangDong,不客气!
      猜你喜欢
      • 2020-07-21
      • 2016-12-23
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 2015-10-23
      • 2020-04-17
      • 2012-11-29
      • 1970-01-01
      相关资源
      最近更新 更多