重新加载ListView不工作React Native

Nig*_*ury 5 listview datasource ecmascript-6 react-native

重新措辞我的问题......(用单独的课程测试)

我试图listview按下按钮随机阵列重新加载.但它不起作用!尝试datasource使用以下LOC 刷新它:

_buttonPressed() {
        this.setState({
            dataSource: this.state.dataSource.cloneWithRows(this._randomArray()),
        });
    }

_randomArray() {

    var jsonRes;

    switch(this.getRandomInt()) // number returned is valid. I checked
    {
        case 1:
        {
            jsonRes = '[' +
            '{ "firstName":"Michel" , "lastName":"John" ,"age":18},' +
            '{ "firstName":"Richard" , "lastName":"Joe","age":20 },' +
            '{ "firstName":"James" , "lastName":"Henry","age":15 },' +
            '{ "firstName":"e" , "lastName":"u","age":15 }]';
            break;
        }
        case 2:
        {
            jsonRes = '[' +
            '{ "firstName":"bacde" , "lastName":"John" ,"age":18},' +
            '{ "firstName":"bacde" , "lastName":"Joe","age":20 },' +
            '{ "firstName":"bacde" , "lastName":"Henry","age":15 },' +
            '{ "firstName":"ebacde" , "lastName":"u","age":15 }]';
            break;
        }
        case 3:
        {
            jsonRes = '[' +
            '{ "firstName":"mmmmm" , "lastName":"John" ,"age":18},' +
            '{ "firstName":"mmmmm" , "lastName":"Joe","age":20 },' +
            '{ "firstName":"mmmmm" , "lastName":"Henry","age":15 },' +
            '{ "firstName":"etttttt" , "lastName":"u","age":15 }]';
            break;
        }
        default:
        {
            jsonRes = '[' +
            '{ "firstName":"dddd" , "lastName":"John" ,"age":18},' +
            '{ "firstName":"dddd" , "lastName":"Joe","age":20 },' +
            '{ "firstName":"dddd" , "lastName":"Henry","age":15 },' +
            '{ "firstName":"ehhgh" , "lastName":"u","age":15 }]';
            break;
        }
    }

    var myObject = eval('(' + jsonRes + ')');
    return myObject;
Run Code Online (Sandbox Code Playgroud)

}

我已经看过示例listview项目了React Native.他们正在dataSource.cloneWithRows为此目的使用它们.不知道我错过了什么小事.请帮我解决这个问题...谢谢!

Nig*_*ury 12

我已经能够成功调试该问题.我刚刚打开了源代码ListViewDataSource.js并跟踪了datablob沿不同函数传递的变量值.

一种方法可_calculateDirtyArrays识别哪些行已更改且需要更新.为此,三个条件中的一个必须匹配一行.

 ........
    // dirty if the section is new, row is new or _rowHasChanged is true
    dirty =
      !prevSectionsHash[sectionID] ||
      !prevRowsHash[sectionID][rowID] ||
      this._rowHasChanged(
        this._getRowData(prevDataBlob, sectionID, rowID),
        this._getRowData(this._dataBlob, sectionID, rowID)
      );
    this._dirtyRows[sIndex].push(!!dirty);
 ........
Run Code Online (Sandbox Code Playgroud)

_rowHasChanged是传递给List Datasource构造函数的那个.

var dataSource = new ListView.DataSource(
{rowHasChanged: (r1, r2) => r1.guid !== r2.guid});
Run Code Online (Sandbox Code Playgroud)

这种情况在我的情况下是错误的,因为在相应的数据更改时应该更改行.我根据我的要求改变了上述条件.

var dataSource = new ListView.DataSource(
        {
            rowHasChanged: function(r1, r2) : bool {
                return (
                (r1["firstName"] !== r2["firstName"]) ||
                (r1["lastName"] !== r2["lastName"]) ||
                (r1["age"] !== r2["age"])
                );
            }
        });
Run Code Online (Sandbox Code Playgroud)

瞧!它现在完美无缺.希望它将来有助于某人!