我已经创建了一个由Apollo客户端和graphQL驱动的反应应用程序
我的模式已定义,因此预期结果是一个对象数组([{name:"metric 1", type:"type A"},{name:"metric 2", type:"type B"}]
)
在我的jsx文件中,我定义了以下查询:
query metrics($id: String!) {
metrics(id: $id) {
type
name
}
}`;
我用Apollo HOC包裹了这个组件,如下所示:
export default graphql(metricsQuery, {
options: (ownProps) => {
return {
variables: {id: ownProps.id}
}
}
})(MetricsComp);
Apollo客户端工作正常,并在render方法中返回道具上的预期列表。
我想让用户操作客户端上的结果(编辑 / 删除列表中的指标,没有突变到实际数据上需要服务器)。但是由于结果是在组件道具上,我必须将它们移动到状态以便能够变异。如何在不造成无限循环的情况下将结果移动到状态?
答案 0 :(得分:1)
如果阿波罗在这件事情上像接力一样工作,你可以尝试使用componentWillReceiveProps
:
class ... extends Component {
componentWillReceiveProps({ metrics }) {
if(metrics) {
this.setState({
metrics,
})
}
}
}
像这样的东西。
答案 1 :(得分:1)
componentWillReceiveProps
将很快被弃用documentation
如果您使用的是React 16,则可以执行以下操作:
class DemoClass extends Component {
state = {
demoState: null // This is the state value which is dependent on props
}
render() {
...
}
}
DemoClass.propTypes = {
demoProp: PropTypes.any.isRequired, // This prop will be set as state of the component (demoState)
}
DemoClass.getDerivedStateFromProps = (props, state) => {
if (state.demoState === null && props.demoProp) {
return {
demoState: props.demoProp,
}
}
return null;
}
您可以通过阅读以下内容进一步了解:(reference link),link1
答案 2 :(得分:0)
您可以使用此:
import {useState} from 'react';
import {useQuery} from '@apollo/client';
const [metrics,setMetrics]=useState();
useQuery(metricsQuery,{
variables:{id: ownProps.id},
onCompleted({metrics}){
setMetrics(metrics);
}
});