【问题标题】:mobX - Filter countries in react native?mobX - 过滤国家反应原生?
【发布时间】:2016-10-18 08:10:23
【问题描述】:

我有一个包含 3 个国家/地区的数组和一个用于过滤它们的文本输入。如果您输入文本输入,它应该检查您输入的国家名称,这应该返回与过滤文本匹配的新过滤国家列表。它还应该在Typed Text:旁边显示输入的文本

import React, { Component } from 'react'
import { View, Text, TextInput } from 'react-native'
import { observable, action } from 'mobx';
import { observer } from 'mobx-react/native'

@observer
export default class Country extends Component {
    @observable filterTermValue;
    @observable countriesList = [
      {'slug': 'amsterdam', 'name': 'Amsterdam'},
      {'slug': 'usa', 'name': 'United States'},
      {'slug': 'vienna', 'name': 'Vienna'}
    ];

    render() {
        return (
            <View>
                <Text>Typed Text: {this.filterTermValue}</Text>
                <TextInput placeholder="Start typing country"
                   value={this.filterTermValue}
                   onChange={this.onChangeFilterTerm} />

                {this.countriesList.map(country =>
                    <View key={country.slug}>
                      <Text>{country.name}</Text>
                    </View>
                )}
            </View>
        )
    }

    @action onChangeFilterTerm = (e) => {
        this.filterTermValue = e.target.value;

        this.countriesList.replace(this.countriesList.filter(el => el.name.toLowerCase().indexOf(this.filterTermValue.toLowerCase()) > -1));
    }
}

这就是我拥有的所有逻辑,但我无法让它发挥作用。唯一有效的是国家列表加载原始数组。一旦我开始输入输入,该值是未定义的并且永远不会打印,并且列表永远不会被过滤。我还尝试了 async 操作和 runInAction 我什至尝试用计算返回过滤后的列表,但似乎无法让它工作。

在 mobX 中执行此操作的正确方法是什么?

【问题讨论】:

    标签: javascript reactjs react-native mobx


    【解决方案1】:

    我看到了一些可能的问题,所以我稍微改变了方法。

    工作示例

    更新Working example。请注意,这在 react-native 中未经测试,但它应该可以工作。

    代码

    @observer
    class Country extends React.Component {
    
    
        @observable filterTermValue = '';
        @observable countriesList = [
          {'slug': 'amsterdam', 'name': 'Amsterdam'},
          {'slug': 'usa', 'name': 'United States'},
          {'slug': 'vienna', 'name': 'Vienna'}
        ];
    
        @computed get filtered() {
          let filteredList = this.countriesList.filter(
            t=>t.name.toLowerCase().indexOf(this.filterTermValue)>-1
          );
          if (filteredList.length)
            return filteredList;
          return this.countriesList;
        }
    
        render() {
            return (
              <div>
                  Term: <input placeholder="Start typing country"
                     onKeyUp={this.onChangeFilterTerm} />
    
                  {this.filtered.map(country =>
                      <div key={country.slug}>
                        <p>{country.name}</p>
                      </div>
                  )}
              </div>
            )
        }
    
        @action onChangeFilterTerm = value => {
            this.filterTermValue = value.toLowerCase();
        }
    }
    

    React-native gotchyas

    使用onChangeText正确签名

    jsx:

        <input placeholder="Start typing country"
                onKeyUp={this.onChangeFilterTerm} />
    

    js:

        @action onChangeFilterTerm = value => {
            this.filterTermValue = value.toLowerCase();
        }
    

    使用mobx-react/native

    如果它仍然不起作用,我会仔细检查:

    不要:

    import {observer} from 'mobx-react';
    

    做:

    import {observer} from 'mobx-react/native';
    

    【讨论】:

    • 感谢您的回答,尽管jsbin可以工作,但我尝试只使用mobx进行状态管理,而不是rn的this.state和this.setState。试图用 mobX 观察者替换它们,但不确定为什么它不起作用。我认为应该可以用纯 mobx 完全替换 rn 对该视图的状态处理。知道是否可能吗?
    • 噢!当我清理 jsbin 时,我并没有真正思考哈哈!让我看看
    • 好吧,这就是你想要的!
    • 再次感谢 - 它几乎可以在 React 中使用,但是如果我输入 am 它可以工作,amv 它会显示所有 3 而不是空的。另外,在 RN 中我更改了 TextInput有value={this.filterTermValue} onChange={this.onChangeFilterTerm} 而不是keyUp 但我得到红色错误屏幕说Cannot read property 'toLowerCase' of undefined 指向@action 的e.target.value。我也尝试将其更改为onChange={this.onChangeFilterTerm.bind(this)},但仍然是同样的错误。不知道为什么它在 RN 中不起作用!
    • Ashley Coolman 在聊天中说:“如果你查看 TextInput 的文档,你可以看到 onChangeText 的函数签名没有传递事件 ({target: {value: "Some text".. .}...}),它传递字符串本身(“一些文本”)。更新了我认为这看起来像的代码(未经测试)“Wonla 说:“Ash,它有效!”
    猜你喜欢
    • 1970-01-01
    • 2019-02-07
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 2022-01-01
    • 1970-01-01
    • 2011-03-06
    相关资源
    最近更新 更多