- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我是 React Native 的新手,在理解它的整个生态系统方面遇到了一些问题。无论如何,我有一个 ListView 并且用户可以导航到另一个 View 以添加将添加到列表中的新项目。当我后退(弹出)时,列表不会更新,因为数据源是在 getInitialState 中分配的。
如何在弹出时强制 View 更新列表?这是通过处理导航器的 onDidFocus 中的路线来完成的,还是我可以添加到实际 ListView 中的任何内容?
提供了代码的缩小版本,当导航器出现弹出事件时,预算组件及其列表需要更新。
索引文件
var BudgetWatch_ReactNative = React.createClass({
renderScene(route, navigator){
if(route.name == 'Main'){
return React.createElement(route.component, {navigator});
}
if(route.name == 'Budgets'){
return React.createElement(route.component, {navigator, realm});
}
},
onDidFocus(route){
// Insert React Native magic?
},
render() {
return (
<Navigator
ref={(nav) => { navigator = nav; }}
style={{flex:1}}
initialRoute={{ name: 'Main', component: Main}}
renderScene={this.renderScene}
onDidFocus={this.onDidFocus}
navigationBar={
<Navigator.NavigationBar
routeMapper={NavigationBarRouteMapper(realm)}
/>
}/>
)
}
});
预算构成
class Budgets extends React.Component{
render(){
return (
<View>
<BudgetList navigator = {this.props.navigator}/>
</View>
)
}
}
var BudgetList = React.createClass({
getInitialState: function() {
var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
return {
dataSource: ds.cloneWithRows(this.props.realm.objects('Budget')),
};
},
render: function() {
return (
<ListView
dataSource={this.state.dataSource}
renderRow={this._renderRow}
/>
);
}
};
希望这足以让您理解问题,谢谢!
编辑:试图达到一个函数,该函数将使用来自 onDidFocus 的列表数据设置新状态。但是由于对该函数的调用是通过 route.component.prototype.updateData(data),this.setState 返回“无法读取未定义的属性‘enqueueSetState’”
最佳答案
所以我发现这应该是 React Native 中 ListView 渲染的一个错误,通过添加一些不太漂亮的代码,我让它工作了。
我在我的索引文件中添加了一个 onDidFocus 方法,每次显示一个组件时都会调用它(这样它就可以在用户弹出到上一个 View 时使用)。当 onDidFocus 中的路由为 Budget 时,我再次返回该组件。我还将 ListView 中使用的数据移出到我的索引中,以便 ListView 将数据作为属性获取,并在数据更改时重新呈现:
index.android.js
var BudgetWatch_ReactNative = React.createClass({
renderScene(route, navigator){
if(route.name == 'Main'){
return React.createElement(route.component, {navigator});
}
if(route.name == 'Budgets'){
var data = realm.objects('Budget').sorted('name');
return <Budgets navigator={navigator} realm={realm} data={data} />
}
},
onDidFocus(route){
if(route.name==='Budgets'){
var data = realm.objects('Budget').sorted('name');
return <Budgets navigator={navigator} realm={realm} data={data} />
}
},
render() {
return (
<Navigator
ref={(nav) => { navigator = nav; }}
style={{flex:1}}
initialRoute={{ name: 'Main', component: Main}}
renderScene={this.renderScene}
onDidFocus={this.onDidFocus}
navigationBar={
<Navigator.NavigationBar
routeMapper={NavigationBarRouteMapper(realm)}
/>
}/>
)
}
});
接下来在 BudgetComponent.js 中,我只是将 props 中的数据设置为状态,并使用该状态数据将其作为 props 发送到我的 BudgetList 组件(我还将它更改为类而不是组件,但这并不重要):
var Budgets = React.createClass({
getInitialState: function() {
var propsdata = this.props.data;
return {
data: propsdata,
};
},
render(){
return (
<View style={styles.container}>
<BudgetList data={this.props.data} realm={this.props.realm} navigator = {this.props.navigator} />
</View>
)
});
现在这应该可以工作,但是由于错误,列表中的数据源无法正常工作,因此通过使用方法 componentWillUpdate(在查看列表时一直调用)我可以强制更新数据。但是,为了不陷入死循环,我不得不检查是否应该更新数据,否则它会卡在更新数据中:
预算列表.js
var BudgetList = React.createClass({
getInitialState: function() {
var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
var data = this.props.data;
return {
data: this.props.data,
dataSource: ds.cloneWithRows(this.props.data),
};
},
componentWillUpdate (nextProps) {
if (this.state.dataSource._cachedRowCount !== this.props.data.length) {
this.setState({
data: this.props.data,
dataSource: this.state.dataSource.cloneWithRows(this.props.data)
})
}
},
_renderRow: function(rowData: string, sectionID: number, rowID: number) {
return(
<View>
<Text>{rowData.name}</Text>
</View>
)
}
});
关于android - react native : Update view (ListView) on navigator pop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37455662/
所以下面的内容让我很困惑。 #!/usr/bin/python test = [0, 0, 0, 1, 2, 3, 4, 5, 6] test1 = [0, 0, 0, 1, 2, 3, 4, 5,
这个问题是这个问题的后续问题: deque.popleft() and list.pop(0). Is there performance difference? 在 Python 中,我可以使用 .
我正在使用 bootstrap v2.2.2。我尝试了其他一些方法(即: close popover outside popover but inside stay open 和 How to dis
我正在用 Python 创建提交后脚本并使用子进程调用 git 命令。 在我的脚本中,我想在运行某些命令之前存储所有更改,然后将它们 pop 。问题是,如果没有任何东西可以存储,stash pop 会
我有一个嵌入在 UINavigationController 中的 UITableViewController,我正在尝试将 Peek & Pop 实现到 TableView 中。我的“窥视”部分工作
我的 Windows 机器上安装了 Cygwin、msysgit 和 TortoiseGit。我正在为 Cygwin 编写一个脚本,该脚本通过 ssh 将 git 推送到远程机器: git push
我在 Jenkins 中使用groovy,并且我需要这个字符串来获取其中的最后一个单词。假设字符串是 STATUS = "EXECUTE SIT" 。所以我所做的就是分割字符串,这样我就会得到一个数组
本文是不太具体的问题的后续/重新表述 Is it possible to have a hyperlink inside {content:"..."}? . 用户 Naeem Shaikh ,非常感
Navigator.of(context).pop 和 Navigator.pop(context) 有什么区别? 对我来说两者似乎都在做同样的工作,实际的区别是什么。一个被弃用了吗? 最佳答案 Na
这可能吗?我想要一个更简单的命令来 git stash pop stash@{13} 其中 stash@{13} 只是 last 意思是“最后的存储在列表上”或“最古老的藏品”。 我知道我可以为 gi
Closed. This question is not reproducible or was caused by typos。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-to
Visual Studio 2019 中用于 GIT 存储的以下命令有什么区别? 分阶段 pop 和恢复 (--index) 全部 pop 为未暂存状态 使用https://visualstudio.
我想弹出模型的最后一层。所以我使用了 tf.keras.layers.pop(),但它不起作用。 base_model.summary() base_model.layers.pop() base_m
我想使用 navigator.pop 将值从第 2 页传递到第 1 页,并使用 initstate 中的新值刷新或重新加载我的第 1 页或任何其他解决方法? 我能够在第一页中获取这些值,但无法使用 i
pop 函数的文档说: user> (doc pop) ------------------------- clojure.core/pop ([coll]) For a list or queu
我有以下点击处理程序,当点击它时,我从 handsontable 中提取一个数组然后从数组中删除最后一个元素,并将新数组传递给 ajax post。问题是,如果我再次单击该按钮,它将从数组中删除另一个
我在mailmuch中制作了表单并从中获取了代码,我添加到网页并使用href,当用户单击显示弹出窗口时显示表单。没关系 show popup 但是现在我有ajax请求,我希望在ajax返回成功时显示此
我目前正在学习 Python 中的 pop() 函数并有一个问题。 >>> a = [1,2,3,4] >>> a.pop(3) #or a.pop() 4 >>> print(a) [1,2,3]
我目前正在学习 Python 中的 pop() 函数并有一个问题。 >>> a = [1,2,3,4] >>> a.pop(3) #or a.pop() 4 >>> print(a) [1,2,3]
我可以将对象$push编码到Mongo数组上,如下所示: db.foo.update({},{$push:{bar:3}}) 但是我找不到一种语法,可以让我对列表中的最后一项进行$pop编码。 我已经
我是一名优秀的程序员,十分优秀!