#javascript #typescript #spfx
#javascript #typescript #spfx
Вопрос:
У меня есть длинная форма в приложении TypeScript React, где нам нужно скрыть / показать или включить / отключить на основе значения status.
export interface IState {
Status: string;
DisableBasicForm: boolean;
DisableFeedbackCtrl: boolean;
DisableTypeofReqCtrl: boolean;
DisablePurposeCtrl: boolean;
DisableDutyStation: boolean;
DisableContractManager: boolean;
DisableSection: boolean;
DisableStartDate: boolean;
DisableEndDate: boolean;
DisableEstimateDate: boolean;
DisableTotalBudget: boolean;
DisableDeliveryDate: boolean;
DisableWBS: boolean;
DisableGrant: boolean;
DisableGrantExpiry: boolean;
DisableCaseSubmitter: boolean;
DisablePreparedBy: boolean;
DisablePreparedDate: boolean;
ShowSupplyManagerPanel: boolean;
ShowBudgetOwnerPanel: boolean;
DisableSupplyManagerPanel: boolean;
DisableBudgetOwnerPanel: boolean;
}
в то время как в классе мне нужно инициировать состояние в конструкторе, что было бы лучшим способом сделать, мне не нужно инициировать очень переменную, присутствующую в IState?
public constructor(props: IGoodsProps) {
super(props);
//What should be written here, minimal code required.
}
Ответ №1:
Если вас устраивает, что некоторые свойства имеют значение по умолчанию undefined
, вы можете пометить их как необязательные при IState
использовании ?
. Например (я выбираю некоторые свойства случайным образом, поскольку я не знаю ваших требований):
export interface IState {
Status: string; // this one is required
DisableBasicForm?: boolean; // this one is optional
DisableFeedbackCtrl?: boolean;
// ...
}
Тогда вы можете опустить необязательные свойства при инициализации состояния в конструкторе.
Какие свойства сделать необязательными? Если вы хотите, чтобы какое-либо из ваших логических значений по умолчанию было false, во многих случаях это undefined
сработает вместо этого, потому что undefined
является «falsey» в JavaScript. (могу подробнее остановиться, если это не имеет смысла)
Ответ №2:
Если вы укажете реализацию IState, вам нужно будет инициировать каждое свойство IState (на основе вашей логики), потому что свойства в IState не помечены как необязательные.
Пример псевдокода:
public constructor(props: IGoodsProps) {
const {status} = this.props
super(props);
this.state ={
Status: status,
DisableBasicForm: status.Status === 'yourValue',
... // initialize here
}
}
Если у вас есть некоторое значение по умолчанию для вашего состояния, переданное в качестве prop, вы могли бы использовать object decostructor:
public constructor(props: IGoodsProps) {
const {status} = this.props
super(props);
this.state ={
...status,
DisableBasicForm: status.Status === 'yourValue', // just overwrite this property with your logic
}
}
Вы также можете инициализировать свое состояние вне costructor:
class Component extends React.Component<Props, State> {
state: State = {
Status: 'value',
... // initialize here
}
constructor(props: Props) {
...
}
Если у вас есть какая-то общая логика для настройки вашего состояния, и вы не хотите повторяться, вы могли бы оценить, используя React.useState
но ваш компонент должен быть функцией.
Комментарии:
1. Это то, чего я не хочу, я не хочу добавлять всю переменную состояния, что-то минимальное, что мне нужно, возможно ли это?. В настоящее время я работаю таким образом.
2. не могли бы вы опубликовать свой реквизит здесь?
3. @Durgesh только что добавил идею с использованием декоструктора объектов.
4. Это происходит не из реквизитов, просто я не хочу инициализировать все значения в конструкторе, потому что много переменных
5. Вы также можете инициализировать свое состояние вне конструктора, но вам все равно нужно инициализировать свою переменную.