MobX 没有正确更新组件
MobX not updating component properly
我对 React/MobX 有点陌生。我正在尝试从我的仪表板组件中的表单创建一个新项目。创建新 item 后,ssoCatalogRegistry Map 和可见项数组在 MobX 存储中得到更新,但是页面没有更新任何信息,它在子组件中创建了一个新元素,但没有数据出现。我可以从商店 console.log 查看数据是否已正确添加。刷新页面后一切加载正常。在不刷新页面的情况下,是否还需要做其他事情才能获得此信息?
仪表板组件
const SSOCatalogDashboard:React.FC = () => {
const rootStore = useContext(RootStoreContext);
const {
openModal,
visibleItems,
loadingStatus,
loadSSOCatalog} = rootStore.ssoCatalogStore;
useEffect(() => {
loadSSOCatalog();
}, [loadSSOCatalog]);
if(loadingStatus) return <LoadingComponent content='Loading sso links from database' />
return (
<Container style={{paddingTop: "50px"}}>
<Row>
<Col sm={10}>
<SSOCatalogForm />
<SSOCatalogCard />
</Col>
<Col>
<Button variant="secondary" onClick={openModal}>New Service</Button>
</Col>
</Row>
</Container>
)
}
export default observer(SSOCatalogDashboard);
卡片组件
const SSOCatalogCard:React.FC = () => {
const rootStore = useContext(RootStoreContext);
const {
visibleItems
} = rootStore.ssoCatalogStore;
return (
<Container>
{visibleItems.map((ssolink: ISSOModel) => (
<Card style={{ width: '18rem' }}>
<Card.Body>
<Card.Title>{ssolink.name}</Card.Title>
<Card.Subtitle className="mb-2 text-muted">{ssolink.linkType}</Card.Subtitle>
<Card.Text>
{ssolink.linkDescription}
</Card.Text>
<Card.Link href={ssolink.url}>{ssolink.url}</Card.Link>
</Card.Body>
</Card>
))}
</Container>
)
}
export default observer(SSOCatalogCard);
MOBX 存储 Observables
rootStore: RootStore;
constructor(rootStore: RootStore) {
this.rootStore = rootStore;
}
@observable ssoCatalogRegistry = new Map()
@observable loadingStatus:boolean = false;
@observable modalOpen:boolean = false;
@observable SSOLink: ISSOModel = {
id:"",
name:"",
url:"",
linkType:0,
owner:"",
ownerEmail:"",
linkDescription:""
}
@observable visibleItems: ISSOModel[] = [];
在商店中更新操作。
//Create new SSO submit.
@action submitSSOLink = async (e:any) => {
if (this.SSOLink.id == "") {
this.SSOLink.id = uuid();
}
e.preventDefault();
this.loadingStatus = true;
try {
await agent.Links.create(this.SSOLink);
runInAction("Creating new SSO Object",() => {
this.ssoCatalogRegistry.set(this.SSOLink.id,this.SSOLink);
this.visibleItems = Array.from(this.ssoCatalogRegistry.values());
console.log(toJS(this.visibleItems));
this.loadingStatus = false;
this.modalOpen = false;
this.SSOLink.id = "";
this.SSOLink.name = "";
this.SSOLink.url = "";
this.SSOLink.linkType = 0;
this.SSOLink.owner = "";
this.SSOLink.ownerEmail = "";
this.SSOLink.linkDescription = "";
})
} catch (error) {
runInAction('create SSO error', () => {
this.loadingStatus = false;
});
console.log(error.response)
}
}
==编辑==
它不仅显示“空”link,在 submitSSOLink 操作结束时将其设置回 null 之后,Form 组件现在是页面上的绑定元素。
我最终更改了这组
this.SSOLink.id = "";
this.SSOLink.name = "";
this.SSOLink.url = "";
this.SSOLink.linkType = 0;
this.SSOLink.owner = "";
this.SSOLink.ownerEmail = "";
this.SSOLink.linkDescription = "";
到另一组可观察对象,然后将它们应用于提交函数。现在看起来像这样
//Create new SSO submit.
@action submitSSOLink = async (e:any) => {
this.SSOLink.id = uuid();
this.SSOLink.name = this.name;
this.SSOLink.url = this.url;
this.SSOLink.linkType = this.linkType;
this.SSOLink.owner = this.owner;
this.SSOLink.ownerEmail = this.ownerEmail;
this.SSOLink.linkDescription = this.linkDescription;
e.preventDefault();
this.loadingStatus = true;
try {
await agent.Links.create(this.SSOLink);
runInAction("Creating new SSO Object",() => {
this.ssoCatalogRegistry.set(this.SSOLink.id,this.SSOLink);
this.visibleItems = Array.from(this.ssoCatalogRegistry.values());
this.loadingStatus = false;
this.modalOpen = false;
this.name = "";
this.url = "";
this.linkType = 0;
this.owner = "";
this.ownerEmail = "";
this.linkDescription = "";
})
} catch (error) {
runInAction('create SSO error', () => {
this.loadingStatus = false;
});
console.log(error.response)
}
}
可能不是最优雅的解决方案,但它适用于我的场景。
我对 React/MobX 有点陌生。我正在尝试从我的仪表板组件中的表单创建一个新项目。创建新 item 后,ssoCatalogRegistry Map 和可见项数组在 MobX 存储中得到更新,但是页面没有更新任何信息,它在子组件中创建了一个新元素,但没有数据出现。我可以从商店 console.log 查看数据是否已正确添加。刷新页面后一切加载正常。在不刷新页面的情况下,是否还需要做其他事情才能获得此信息?
仪表板组件
const SSOCatalogDashboard:React.FC = () => {
const rootStore = useContext(RootStoreContext);
const {
openModal,
visibleItems,
loadingStatus,
loadSSOCatalog} = rootStore.ssoCatalogStore;
useEffect(() => {
loadSSOCatalog();
}, [loadSSOCatalog]);
if(loadingStatus) return <LoadingComponent content='Loading sso links from database' />
return (
<Container style={{paddingTop: "50px"}}>
<Row>
<Col sm={10}>
<SSOCatalogForm />
<SSOCatalogCard />
</Col>
<Col>
<Button variant="secondary" onClick={openModal}>New Service</Button>
</Col>
</Row>
</Container>
)
}
export default observer(SSOCatalogDashboard);
卡片组件
const SSOCatalogCard:React.FC = () => {
const rootStore = useContext(RootStoreContext);
const {
visibleItems
} = rootStore.ssoCatalogStore;
return (
<Container>
{visibleItems.map((ssolink: ISSOModel) => (
<Card style={{ width: '18rem' }}>
<Card.Body>
<Card.Title>{ssolink.name}</Card.Title>
<Card.Subtitle className="mb-2 text-muted">{ssolink.linkType}</Card.Subtitle>
<Card.Text>
{ssolink.linkDescription}
</Card.Text>
<Card.Link href={ssolink.url}>{ssolink.url}</Card.Link>
</Card.Body>
</Card>
))}
</Container>
)
}
export default observer(SSOCatalogCard);
MOBX 存储 Observables
rootStore: RootStore;
constructor(rootStore: RootStore) {
this.rootStore = rootStore;
}
@observable ssoCatalogRegistry = new Map()
@observable loadingStatus:boolean = false;
@observable modalOpen:boolean = false;
@observable SSOLink: ISSOModel = {
id:"",
name:"",
url:"",
linkType:0,
owner:"",
ownerEmail:"",
linkDescription:""
}
@observable visibleItems: ISSOModel[] = [];
在商店中更新操作。
//Create new SSO submit.
@action submitSSOLink = async (e:any) => {
if (this.SSOLink.id == "") {
this.SSOLink.id = uuid();
}
e.preventDefault();
this.loadingStatus = true;
try {
await agent.Links.create(this.SSOLink);
runInAction("Creating new SSO Object",() => {
this.ssoCatalogRegistry.set(this.SSOLink.id,this.SSOLink);
this.visibleItems = Array.from(this.ssoCatalogRegistry.values());
console.log(toJS(this.visibleItems));
this.loadingStatus = false;
this.modalOpen = false;
this.SSOLink.id = "";
this.SSOLink.name = "";
this.SSOLink.url = "";
this.SSOLink.linkType = 0;
this.SSOLink.owner = "";
this.SSOLink.ownerEmail = "";
this.SSOLink.linkDescription = "";
})
} catch (error) {
runInAction('create SSO error', () => {
this.loadingStatus = false;
});
console.log(error.response)
}
}
==编辑==
它不仅显示“空”link,在 submitSSOLink 操作结束时将其设置回 null 之后,Form 组件现在是页面上的绑定元素。
我最终更改了这组
this.SSOLink.id = "";
this.SSOLink.name = "";
this.SSOLink.url = "";
this.SSOLink.linkType = 0;
this.SSOLink.owner = "";
this.SSOLink.ownerEmail = "";
this.SSOLink.linkDescription = "";
到另一组可观察对象,然后将它们应用于提交函数。现在看起来像这样
//Create new SSO submit.
@action submitSSOLink = async (e:any) => {
this.SSOLink.id = uuid();
this.SSOLink.name = this.name;
this.SSOLink.url = this.url;
this.SSOLink.linkType = this.linkType;
this.SSOLink.owner = this.owner;
this.SSOLink.ownerEmail = this.ownerEmail;
this.SSOLink.linkDescription = this.linkDescription;
e.preventDefault();
this.loadingStatus = true;
try {
await agent.Links.create(this.SSOLink);
runInAction("Creating new SSO Object",() => {
this.ssoCatalogRegistry.set(this.SSOLink.id,this.SSOLink);
this.visibleItems = Array.from(this.ssoCatalogRegistry.values());
this.loadingStatus = false;
this.modalOpen = false;
this.name = "";
this.url = "";
this.linkType = 0;
this.owner = "";
this.ownerEmail = "";
this.linkDescription = "";
})
} catch (error) {
runInAction('create SSO error', () => {
this.loadingStatus = false;
});
console.log(error.response)
}
}
可能不是最优雅的解决方案,但它适用于我的场景。