gpt4 book ai didi

javascript - 如何创建共享功能但具有独立状态的 react 组件?

转载 作者:行者123 更新时间:2023-11-29 10:34:25 25 4
gpt4 key购买 nike

我想创建两个 React 组件。他们需要共享共同的功能。这些函数使用 this.setState(),所以我无法将它们放在帮助文件中。我尝试使用 composition。这使我能够共享函数,但它们也共享状态。

我需要类似的东西

//file 1
var Component1 = React.createClass({
getInitialState() {
return {
//return some common + new states
}
});

//file 2
var Component2 = React.createClass({
getInitialState() {
return {
//return some common + new states
}
});

// file 3
// This file needs to have some functions, which can do:
this.setState(); //on state of Component1 and Component2.

最佳答案

这里有几个选项。

商店

如果这些组件是完全独立的,您可以使用商店来保存和更新每个组件使用的数据,并订阅商店。这就是 Flux/Redux 模式。

一个组件可能看起来像这样

class Component1 extends React.Component {
constructor(...props) {
super(...props)
this.update = this.update.bind(this)
this.state = { count: 0 }
}

update (storeData) {
this.setState(storeData)
}

componentDidMount () {
store.subscribe(this.update)
}

componentDidUnmount () {
store.unsubscribe(this.update)
}

render () {
return (<span>You have clicked {this.state.count} times</span>)
}
}

这里要注意的是,store 不能直接访问组件的状态。组件订阅,其他一些机制将发布数据。如果发生这种情况,商店将调用已注册的回调。一个非常的简单商店可能看起来像这样

const store = {
subscriptions: new Set(),
data: {},
subscribe: function (callback) {
this.subscriptions.add(callback)
},
unsubscribe: function (callback) {
this.subscriptions.delete(callback)
},
update: function (key, value) {
this.data[key] = value
this.subscriptions.forEach(cb => cb(this.data))
}
}

这允许任何有权访问商店的人更新订阅它的任何/所有组件。

const CounterButton = () => (
<button onClick={() => store.update('count', (store.data.count || 0) + 1)}>Increase Count</button>
)

这里很contrived codepen证明这一点

父组件

如果您的组件都是共享组件的子组件,那么它们的父组件可以通过更新它们的 props 来更新它们,而不是更新它们的状态。它可以使用自己的内部状态对此进行跟踪。

class ParentComponent extends React.Component {
constructor(...props) {
super(...props)
this.state = { clicks: 0 }
}

render () {
return (
<div>
<button onClick={() => this.setState({ clicks: this.state.clicks + 1})}>Increase Count</button>
<Component1 clicks={this.state.clicks} />
<Component2 clicks={this.state.clicks} />
</div>
)
}
}
const Component1 = ({clicks}) => (
<span>You have clicked {clicks} times</span>
)

const Component2 = (props) => (
<span>You have pressed {props.clicks} times</span>
)

这是一个 equally contrived codepen证明这一点

有些疯狂 else

以上两种是推荐的方式。但这是 JavaScript,我们的规则比狂野西部少。如果您真的想通过某些共享函数直接控制组件的状态,没有什么能阻止您

var sharedComponents = new Set()

function incrementComponents () {
sharedComponents.forEach(c => c.setState({clicks: c.state.clicks + 1}))
}

class Component1 extends React.Component {
constructor(...props) {
super(...props)
this.state = { clicks: 0 }
sharedComponents.add(this)
}

render () {
return (<span>You have clicked {this.state.clicks} times</span>)
}
}

setInterval(incrementComponents, 1000)

这是一个completely insane codepen证明这一点。

关于javascript - 如何创建共享功能但具有独立状态的 react 组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39219482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com