- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 react & redux
开发应用程序,我需要 setProps 但它已被弃用。
看看下面的错误:
Warning: setProps(...) and replaceProps(...) are deprecated. Instead, call render again at the top level.
Uncaught Invariant Violation: setProps(...): You called
setProps
on a component with a parent. This is an anti-pattern since props will get reactively updated when rendered. Instead, change the owner'srender
method to pass the correct value as props to the component where it is created.
那么我该如何设置 Prop 呢?基本上是管理一些标签,看看下面我的代码:
export default React.createClass({
render: function() {
return (
<div className="demo-tabs">
<Tabs activeTab={this.props.activeTab}
onChange={(tabId) => this.setProps({ activeTab: tabId })} ripple>
<Tab>Stack</Tab>
<Tab>GitHub</Tab>
<Tab>Twitter</Tab>
</Tabs>
<section>
<div className="content">Content for the tab: {this.props.activeTab}</div>
</section>
</div>
);
}
});
容器
import React from 'react';
import TimeLine from './timeline';
import { connect } from 'react-redux';
import { getStackoverflow } from 'api/timeline';
const TimeLineContainer = React.createClass({
componentWillMount: function() {
getStackoverflow();
},
render: function() {
return (
<TimeLine {...this.props} />
)
}
});
const stateToProps = function(state) {
return {
timeline: state.timelineReducer.timeline
}
}
const dispatchToProps = function(dispatch) {
return {
onClick: () => {console.log('timeline was clicked')}
}
}
export default connect(stateToProps, dispatchToProps)(TimeLineContainer)
reducer
var timelineInitialState = {
github: [],
gist: [],
stackoverflow: [],
twitter: [],
activeTab: 2
}
export default function(state = timelineInitialState, action) {
switch (action.type) {
case 'GET_GITHUB':
//TODO: implement.
break;
case 'GET_GIST':
//TODO: implement.
break;
case 'GET_STACKOVERFLOW':
var stackoverflowState = Object.assign({}, state)
stackoverflowState.stackoverflow = action.stackoverflow;
return stackoverflowState;
break;
case 'GET_TWITTER':
//TODO: implement.
break;
default:
return state;
}
}
最佳答案
看起来您在没有牢牢掌握 React 的情况下就开始使用 Redux。我不建议这样做,因为您现在似乎有些困惑。
Thinking in React是一个很好的指南,我建议您在使用 Redux 之前先通读它并熟悉 React 中的状态所有权的概念。
在 React 中,随时间变化的事物(“状态”)始终由某个组件“拥有”。有时它是使用此状态进行渲染的同一组件。有时需要同步许多组件,以便将状态“提升”到某个可以管理它们的父组件,并通过 props 传递该信息。每当状态发生变化时,它们都会得到更新。
这里的重要部分是 props
应该由 parent 接收。如果一个组件想要改变它自己的 props,这是一个问题的征兆:
state
对于此组件,您可以调用 setState
onChange
这样的回调属性所以它可以“询问”要更改的值在第一种情况下,你的代码看起来像这样,而且它是有效的 React:
export default React.createClass({
getInitialState: function() {
return { activeTab: 0 }
},
render: function() {
return (
<div className="demo-tabs">
<Tabs activeTab={this.state.activeTab}
onChange={(tabId) => this.setState({ activeTab: tabId })} ripple>
<Tab>Stack</Tab>
<Tab>GitHub</Tab>
<Tab>Twitter</Tab>
</Tabs>
<section>
<div className="content">Content for the tab: {this.state.activeTab}</div>
</section>
</div>
);
}
});
但是,您可以使用 <Tabs>
继续您已经使用的模式内部组件,并将状态提升到更高。然后你的组件需要接受 onChange
它将传递给 <Tabs>
的 Prop .现在它不知道状态是如何更新的,并且不保存状态:
export default React.createClass({
render: function() {
return (
<div className="demo-tabs">
<Tabs activeTab={this.props.activeTab}
onChange={this.props.onChange} ripple>
<Tab>Stack</Tab>
<Tab>GitHub</Tab>
<Tab>Twitter</Tab>
</Tabs>
<section>
<div className="content">Content for the tab: {this.props.activeTab}</div>
</section>
</div>
);
}
});
这两种方法都没有好坏之分,它们用于不同的目的。当状态与应用程序的其余部分无关时,第一个更方便,当其他远程组件恰好也需要它时,第二个更方便。确保您了解这两种方法的权衡。
即使采用第二种方法,某些东西也必须保持状态。它可以是另一个组件,或者(这就是 Redux 的用武之地)它可以是一个单独的数据存储,如 Redux 存储。在这种情况下,而不是供应 onChange
从父组件中,您将使用 connect()
绑定(bind) onChange
支持它注入(inject)调度 Redux 操作:
const mapStateToProps = (state) => {
return {
activeTabId: state.activeTabId
}
}
const mapDispatchToProps = (dispatch) => {
return {
onChange: (tabId) => dispatch({ type: 'SET_ACTIVE_TAB', tabId })
}
}
在你的 reducer 中,你可以处理这个 Action :
const activeTabId = (state = 0, action) => {
switch (action.type) {
case 'SET_ACTIVE_TAB':
return action.tabId
default:
return state
}
}
const reducer = combineReducers({
activeTabId,
// other reducers
})
const store = createStore(reducer)
在这两种情况下我们都不需要 setProps
.您可以:
setState
,activeTabId
和 onChange
Prop 并从树中更高的组件管理它们,该组件将使用 setState
, 或activeTabId
和 onChange
作为 Prop 。关于javascript - 如何避免在 React 中使用 setProps?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36634522/
在 Win32 API 中,我们有两个名为“SetProp”和“GetProp”的函数来设置和获取由 HWND 标识的窗口的属性 设置 Prop : http://msdn.microsoft.com
谁能告诉我为什么下面的代码不起作用?我没有收到任何编译器错误。 short value = 10; SetProp(hCtl, "value", (short*) value); 最佳答案 第三个参数
在父组件App中,我渲染子组件PersonsTable: var App = React.createClass({ addPerson: function() { // bu
我试图在 Samsung S7 上为应用程序设置 firebase Debug模式但不能 adb shell setprop firebase.analytics.debug-mode com.roo
我正在使用 react & redux 开发应用程序,我需要 setProps 但它已被弃用。 看看下面的错误: Warning: setProps(...) and replaceProps(...
本文整理了Java中gobblin.source.workunit.WorkUnit.setProp()方法的一些代码示例,展示了WorkUnit.setProp()的具体用法。这些代码示例主要来源于
我正在使用类似的东西: var MUSIC = React.renderComponent( Music({ }), document.getElementById("music-div")) 稍后在
在模拟器上运行 adb shell,尝试将 setProp 用于只读属性,例如 setprop ro.carrier newCarrier,但它不会改变它。 有没有办法强制覆盖 ro Prop ? 最
//in my component i have {this.props.auth.isLoadding && Is registring... } //in my test i have it
当我尝试为名称 >= 32 个字符的属性设置值时出现错误 adb shell setprop 01234567890123456789012345678901 VALUE 错误: could not
我刚刚将项目的 React 版本升级到 13.3,setProps() 不再有效。我在这个 Mocha 测试中使用它,但我不确定现在如何重写它。我有哪些选择? it('reloads search r
我尝试使用 setprop libc.debug.malloc = 1 来找出泄漏。我制作了一个演示程序并在其中引入了内存泄漏,但上面的标志无法检测到此泄漏。我尝试了以下命令:adb shell se
我正在开发一个应用程序(使用 Eclipse + Android SDK/NDK),它使用 Android 手机上的微型 USB 端口连接到外围设备。我正在尝试通过 WiFi(tcp 端口 5555)
我想了解 adb shell setprop mypropertykey mypropertyvalue 的工作原理。换句话说,我编辑了 /system/build.prop 文件,但是当我尝试使用
我正在使用 ReactJS(通过 facebook),我可以选择调用 setState 或 setProps,但不知道哪个在性能方面更有效。 (不要只看我的代码。这只是一个简化。我主要关心的是知道 s
为了在我的 Android(Kitkat)开发板上提供以太网连接,我使用 ndc 命令工具来设置 DNS 服务器 IP。一切正常,但无法使用系统属性中的 getprop 查看 DNS 服务器详细信息。
我将 GetProp()/SetProp() 与 Atom 结合使用。在 x64 下,SetProp() 的“lpString”是 64 位长。 MS 文档说:“原子必须放在 lpString 的低位
我正在尝试使用 setprop 命令更改我的 android 设备上的时区,但它没有反射(reflect)在设备上(我也尝试重新启动) shell@ASUS_Z010:/ $ getprop pers
在搜索如何调试 sqlite 时,我遇到了命令adb shell setprop log.tag.SQLiteStatements VERBOSE但它似乎没有在我的设备 运行 CyanogenMod
我有一个设置 Prop 的测试,以观察组件的一些变化。唯一的麻烦是我将呈现的元素包装在 中因为在树的下方还有一些连接的组件。 我正在渲染 const el = () => ; const wrapp
我是一名优秀的程序员,十分优秀!