ããã«ã¡ã¯@ericanderson
å®éã«äœ¿çšãããšããã®å€æŽã«é¢ããŠå€ãã®åé¡ãçºçããŸãã
å°éå ·ãŸãã¯ç¶æ ã®ããããã£ã§[å®çŸ©ã«ç§»å]ãæŒããšãTypescriptã¯ããã解決ã§ããŸããã
interface MyComponentProps {
name: string;
}
export abstract class MyComponent extends React.Component<MyComponentProps , void> {
myMethood() {
this.props.name; //<-- Go To definition in name
}
}
ã¡ã³ããŒã¯åæçã«çæãããã®ã§çã«ããªã£ãŠããŸããããšã«ããè¿·æã§ãã
ããã«éèŠãªã®ã¯ã次ã®ãããªæœè±¡çãªã³ã³ããŒãã³ããäœæããå Žåã§ãã
interface MyBaseProps {
onChange?: (val: any) => void;
}
export abstract class MyBase<P extends MyBaseProps> extends React.Component<P, void> {
myMethood() {
this.props.onChange!(2); //The type is S["onChange"] instead of (val: any) => void and so is not invocable.
}
}
TSã¯ãããããã£onChangeãããããšã瀺ãããšãã§ããŸããã圌ã®ã¿ã€ããæ€åºã§ããªãå ŽåããããŸãã
ããã¯æãéèŠãªå€æŽã§ãããªããªããå ±éã®å°éå ·ãšæ©èœãå ±æããã³ã³ããŒãã³ãã®éå±€ãäœæã§ããªããªãããã§ãã TSã³ã³ãã€ã©ã®åé¡ã®ããã«èŠããŸãããä¿®æ£ããããŸã§ã¯ã
ãã®å€æŽãReactã®æ©èœçæå³ãããŸãæããŠããããšã«åæããŸãããã³ã³ã¹ãã©ã¯ã¿ãŒã®ããã«ç¶æ ã匷å¶çã«å€æŽã§ããæå¹ãªç¶æ³ããããŸãããŸããç¶æ ãå€æŽããŠforceUpdateãåŒã³åºããšæ£åžžã«æ©èœããŸãã
C#
this.state.name = "John";
this.forceUpdate(); //Ok as long as you don't setState afterwards, but calling setState also is annoying with the callback.
ãå§ãã§ããïŒ ãããã
çŠæ¢ãããŠããŸããïŒ ãŸããããã§ãªãå ŽåãforceUpdateã¯ååšããŸããã
ãã¡ãããç¶æ
ãS
ïŒãŸãã¯any
ïŒã«ãã£ã¹ãããŠå€æŽãå ããããšãã§ããŸããããããäžè¬çãªãã¿ãŒã³ã®å Žåã¯é¢åã«ãªããŸãã
ãã®å ŽåãTSã®æ°ããå æ²¢ã®ããæ©èœã解決çãããå€ãã®åé¡ãåŒãèµ·ããã®ã¯æ²ããããšã§ãããæ£çŽãªãšããããããåœãŠã¯ãŸããšæããŸãã
äžæ¹ã setState
ã®å€æŽã¯çŽ æŽãããã§ãðã Pick<S,K>
ã«ã€ããŠç¥ããŸããã§ããã
Visual Studioã§äœ¿çšããŠããtypescriptã®ããŒãžã§ã³ã¯äœã§ããïŒ
@vsaio for sa
åé¡1ã®å ŽåãTS 2.1.5ãšææ°ã®VSCodeã䜿çšãããšãããã¯åé¡ãªãæ©èœããŸãã ç§ã¯windows/VSãæã£ãŠããªãã®ã§ãããã§ç¢ºèªããããšã¯ã§ããŸãããããã©ã°ã€ã³ã«æŽæ°ãããããTS2.1.5ã䜿çšããŠããªãã«éããããŸããã
åé¡2ã«ã€ããŠãåã
TS2.1.5.0ã䜿çšããVS2015
åé¡3ã¯è°è«ã®äœå°ããããšæããŸãã
äžèšã®äŸãReactã§_æè¡çã«_å®è¡ã§ããããšã¯æ£ããã§ãããReactãæå³ãããæ¹æ³ã§ã¯ãªãããšã¯ééããããŸããã
ããã¯ã3ã€ã®ç°ãªãã±ãŒã¹ã«åããããšãã§ããŸãã
interface State {
bar: number;
}
interface Props {
baz: number;
}
class Foo extends React.Component<Props, State> {
public state: State = {
bar: 5,
};
}
interface State {
bar: number;
}
interface Props {
baz: number;
}
class Foo extends React.Component<Props, State> {
constructor(props: Props) {
super(props);
this.state = {
bar: props.baz,
};
// or
this.setState({
bar: props.baz,
});
}
}
forceUpdate
ã䜿çšããã©ã³ãã ãªå²ãåœãŠäººã
ããæ£ããããã®ã«åããããæ¹ãè¯ããšæãã®ã§ã public state
ãå宣èšããããšã§ããã®åé¡ãç°¡åã«åé¿ã§ããŸãã
interface State {
bar: number;
}
class Foo extends React.Component<{}, State> {
public state: State;
public myMethod() {
this.state.bar = 5;
}
}
ç§ã®åé¡ã¯ãžã§ããªãã¯ã®åæ£ã«ãããŸãã ç¹ã«ãäžè¬çã«å ¥åãããã¯ã©ã¹å ã§ã®å ¥åçšã§ãã 以äžã¯ãç©äºã厩å£ããå Žæã®éåžžã«æå°éã®ãµã³ãã«ã§ãã
class TBaseState {
public value: string;
}
function globalFunc<T extends Readonly<TBaseState>>(item: T) {
}
class MyComponent<TProps, TState extends TBaseState> extends React.Component<TProps, TState> {
broken() {
// typing of this.state is Readonly<TState>
// this is not assignable to Readonly<TBase>
globalFunc(this.state);
// this is a horrible hack to fix the generics variance issue
globalFunc(this.state as TState as Readonly<TBaseState>);
}
}
class MyState extends TBaseState {
}
let component: MyComponent<any, MyState>;
// here the typing of component.state is Readonly<MyState>
// this is assignable to Readonly<TBase>
globalFunc(component.state);
ç§ã¯TS2.1.5.0ã«ããŸã
ããããVSã§ã¯VSã³ãŒããããTSãšã¯ã¹ããªãšã³ã¹ãææªã§ããå¯èœæ§ããããŸã...
åé¡1ã®å Žåãå®çŸ©ã«é²ã¿ãŸããTSãVSCodeã§ã¯æ©èœããŸããã
interface MyComponentProps {
name: string;
}
export abstract class MyComponent extends React.Component<MyComponentProps , void> {
fullName: string;
myMethood() {
this.props.name; //<-- doesnt work
this.fullName; //<-- works
}
}
åé¡2ã®å ŽåãVSCodeã®åäœãåªããŠããã®ã¯äºå®ã§ãã
VSã¯æ··ä¹±ããŠããããã«èŠããŸããïŒ
VSCodeãšåé¡1ã«ã€ããŠã¯ãããã¹ããŒããªåŠçãå¿ èŠãªãææ°ã®TypescriptãšJavascriptã®ææ³ãã®ãã©ã°ã€ã³ã䜿çšããŠãããããæ©èœããŠãããšæããŸãã
@patsissonsã¯èå³æ·±ãäŸã§ãããå®çŸ©ãã¡ã€ã«ã®ãã°ãããtypescriptã®ãã°ã®æ¹ã代衚çã ãšæããŸãã ããšãã°ã setState
ã¯S
ã䜿çšããŠããŸãããããã¯ã setState({foo:5} as any as State)
ã®ãããªå¥åŠãªããªãã¯ãå®è¡ããããé¢æ°ã䜿çšãããããå¿
èŠããã£ãããŒã·ã£ã«ãå®è¡ããããšãæå³ããŠããŸããã ã³ã³ãã€ã©ã®è¡šçŸåºŠã®æ¬ åŠãã¿ã€ãã³ã°ããééã£ãããã®ã«ãããã©ããã¯ããããŸããã ããã¯ããã®ãšããžã±ãŒã¹ãããŒã¯ããããã«READMEãå€æŽããããã®é©åãªè°è«ã ãšæããŸãã
TSã«åé¡ãæåºããŸãããïŒ
ãããã£ãŠããã®å€æŽã«ãããçŸåšããã¹ãŠã®VSãæ©èœããªããªãããã©ã°ã€ã³ãããå Žåãé€ããŠããã¹ãŠã®VSã³ãŒãã§[å®çŸ©ã«ç§»å]ãç¡å¹ã«ãªããŸã...
ãŸããå®å šæ§ã®è°è«ããããŸãã React.d.tsã«ã¯ãèªã¿åãå°çšã§ãããçŸåšã§ã¯ãªãAPIãç¡æ°ã«ãããŸãã
interface ComponentLifecycle<P, S> {
componentWillMount?(): void;
componentDidMount?(): void;
componentWillReceiveProps?(nextProps: Readonly<P>, nextContext: any): void;
shouldComponentUpdate?(nextProps: Readonly<P>, nextState: Readonly<S>, nextContext: Readonly<any>): boolean;
componentWillUpdate?(nextProps: Readonly<P>, nextState: Readonly<S>, nextContext: Readonly<any>): void;
componentDidUpdate?(prevProps: Readonly<P>, prevState: Readonly<S>, prevContext: Readonly<any>): void;
componentWillUnmount?(): void;
}
èªã¿åãå°çšã¯ãããšãã°ã€ãã³ããªããžã§ã¯ãã®ããã«ãå€æŽããããšãæå³ããŠããªãæèã®ãã³ã°ããŒã«ã§ã¯ãªãããfreezeããŸãã¯ãInmmutable.jsãã«äœ¿çšããå¿ èŠããããšæããŸãã
ãŸã æåºããŠããŸãããä»æ¥ãæ°ããReadonly<T>
ã¿ã€ããåŠçããããã«ã³ãŒããæ¹è¯ããã ãã§ããããã¯ãé©åã«ã¿ã€ãããããœãªã¥ãŒã·ã§ã³ããªãããšã«ééããã±ãŒã¹ã§ãã å
ã«é²ãã§åé¡ãæåºããŠãã ãããä»æ¥ã®æ®ãã®æéã®ã»ãšãã©ã¯ããããã³ãŒãã§å¿ãããªããŸãã
ãããã¯ããç§ã¯ç§ãããã€ããéããããšãç¥ã£ãŠããŸããã @olmobrutallèªã¿åãå°çšãšããŠããŒã¯ããããã«å°å ¥ããç¶æ ã®å€æŽãä¿æããå Žåããããã®ã¡ãœãããæŽæ°ããå¿ èŠãããããšã«åæããŸãã ããããæåã«è¡ãã¹ãæ£ããããšã«ã€ããŠã®ã³ã³ã»ã³ãµã¹ãå¿ èŠã ãšæããŠããŸãã
VSãã¬ã€ã¯ã«é¢ããŠã¯ãäœãæ£ããã®ãããããŸããã äžéšã®ããŒã«ãææ°ã®ç¶æ ã«ä¿ãããŠããªããããã¿ã€ããæ§ããå¿ èŠããããŸããïŒ
@patsissonsãã¹ãŠã®ã³ãŒããæŽæ°ããåã«ããããã©ã®ããã«ãã³ã¢ãŠããããã確èªãããå Žåã¯ãä»ã®ãšãããreactçšã«ç¬èªã®ã¿ã€ãã³ã°ããã€ã§ãæäŸã§ããŸãã https://ericlanderson.com/using-custom-typescript-definitions-with-ts-2-x-3121db84015d#.ftlkojwnb
ç§ãã¡ã®çµéšã§ã¯ãVSã¯åžžã«å°ãé ããŠããŸãã åœåºã§ã¯vscodeã䜿çšããŠã¢ã¯ãã£ããªã¿ã€ãã¹ã¯ãªããéçºãè¡ã£ãŠãããVSã¯ã³ãŒããã¡ã€ã«ã«ããããé©çšããããã¿ã€ãã¹ã¯ãªãã以å€ã®éçºè ãã³ãŒãã調ã¹ããããããã«äœ¿çšãããŸãããå¿ ãããã¢ã¯ãã£ããªéçºã§ã¯ãããŸããã
@ericandersonããã¯ã¯ä»ã®ãšããããã»ã©æªãã¯ãããŸããã Readonly<Base>
ã«å²ãåœãŠå¯èœãªT
ãååŸããã«ã¯ã$ Readonly<T>
ãå¹ãé£ã°ãå¿
èŠããããŸãã
'react.d.ts'ã«ã€ããŠè©±ããŠããã®ã§ããã®åäžã¡ã³ããŒå®£èšã¯å€§èŠæš¡ã«äœ¿çšãããŠããŸãã VSã®æºåãæŽããŸã§æ§ãã䟡å€ããããšæããŸãã
ãŸããAPIããååŸãããªããžã§ã¯ãã®ããã«ãäžçäžã®åã®50ïŒ ãèªã¿åãå°çšã§ããããã«ã泚éãä»ããå¿ èŠã¯ãªããšæããŸãã
get-onlyããããã£ãæã€ããã«æ瀺çã«å€æããããªããžã§ã¯ãã«ã¯ãReadonlyã䜿çšããå¿ èŠããããšæããŸãã ããªãŒãºã®ããã«ã
@olmobrutall Readonly
ã¯æ°ãããããæ£ç¢ºãªãã¹ããã©ã¯ãã£ã¹ã¯å®éã«ã¯å®çŸ©ãããŠããŸããã ç§ã¯å人çã«ãããããããå€åãããªãããšã瀺ãã®ãå©ããããã«ãããReadonly<>
ã®ãã®ãå¿
èŠãšããããšããã¹ãŠå®£èšããããšãæã¿ãŸãã åæ§ã«ãReactã¯setState
state
ãå€æŽããããšãæåŸ
ããŠããŸããããããã£ãŠããã®å€æŽã«ãããäºæ
ã«ãã£ãŠãã°ãçºçããªãããšãä¿èšŒãããŸããããã¯ãJavaScriptãããTypeScriptã䜿çšããäž»ãªå©ç¹ã®1ã€ã§ãã
Object.freeze
ã®ãã©ãŠã¶éã§ããã©ãŒãã³ã¹ãããäžè²«ããŠããå ŽåãReactã®äººã
ã¯setState
ã®åŸã«å®éã«ããªãŒãºãå§ãããšæããŸãã
ã§ã¯ãforceUpdateã®ç®çã¯äœã§ããïŒ
ããŒã«ã®æŽæ°ã«é¢ããŠDefinitelyTypedãã©ã®ããã«æ©èœãããã«ã€ããŠã®ä»ã®äººã ã®èãããreactã§ã®èªã¿åãå°çšïŒããã³ç¹å®ã®ãªããžã§ã¯ããå€æŽããªãããšãç®çãšããä»ââã®ã©ã€ãã©ãªïŒã«ã€ããŠã®å²åŠã«èå³ããããŸãã
cc / @johnnyreilly @vsaio @ pspeter3å
·äœçã«åå¿ããããšã«ã€ããŠã®èããããã³äžè¬çãªä»ã®èãã«ã€ããŠ
cc / @ andy-ms @mhegazyã¯ãããŒã«ã®æŽæ°ãšReadonly
ã®ç±å¿ãªäœ¿çšã®ããã«ãDefinitelyTypedãå²åŠçã«ã©ã®ããã«é²ãã¹ããã«ã€ããŠã®èãã瀺ããŠããŸãã
@olmobrutall forceUpdate
ã䜿çšããŠãç¶æ
åŽã§èŠ³å¯å¯èœãªã€ãã³ãããé§åãããåå¿åŽã§ã¬ã³ããªã³ã°ããã¥ãŒã«å
¥ããŸãã
æŽæ°ïŒ
誀解ãããªãããã«ãã·ããªãªãå°ãæ確ã«ããŸãã ç§ãã¡ã®ç¶æ
ãªããžã§ã¯ãã¯é·çãããäžå€ãªããžã§ã¯ãã§ãïŒãããã£ãŠã Readonly<T>
ã¯å®éã«ã¯ç§ãã¡ã«éåžžã«é©ããŠããŸãïŒã ãããã®ç¶æ
ãªããžã§ã¯ãã«ã¯ã stateChanged
ãšåŒã°ããéç¥ç£èŠå¯Ÿè±¡ã«å°éããè€æ°ã®rxjs
ç£èŠå¯èœã¹ããªãŒã ãå«ãŸããŠããŸãã Reactã³ã³ããŒãã³ãã¯ããã®ç£èŠå¯èœãªã€ãã³ããç£èŠãããããã®ã€ãã³ããforceUpdate
ãžã®åŒã³åºãã«æ³šã蟌ã¿ãŸãïŒãããŠã³ã¹åŸïŒã äºå®äžãç§ãã¡ã®å¯å€ç¶æ
ã¯ç¶æ
å
ã«ååšããŸãããç¶æ
èªäœãšç¶æ
ã«ååšããã¡ã³ããŒã¯ãã¹ãŠäžå€ã§ãã ããã¯ç¢ºãã«Reactã®æšæºçãªãŠãŒã¹ã±ãŒã¹ã§ã¯ãããŸãããããããŒã¯éåžžã«äŒŒãŠããŸãã åã¬ã³ããªã³ã°ãå¿
èŠãªãšãã«ã³ã³ããŒãã³ãã«éç¥ããæ¹æ³ãç¥ã£ãŠããã¹ããŒãã¹ããŒããªããžã§ã¯ãããããŸãã
@ericandersonã®äž»ãªåé¡ã¯ããããã®åå®çŸ©ãSemVerã®åé¡ã«æ©ãŸãããŠããããšã§ãã ã¿ã€ãå®çŸ©ããŒãžã§ã³ã¯äž»ã«ããããã®ã¢ãžã¥ãŒã«ããŒãžã§ã³ã«é¢é£ä»ããããŠãããããã¿ã€ãå®çŸ©ã®å€æŽãå£ããã€ããŒããŒãžã§ã³ãã³ããçºçããŸããã€ãŸãã @types
ããŒãžã§ã³ãpackage.json
ã«åºå®ããå¿
èŠããããŸãããã¡ã€ã«ã
@olmobrutallåå¿ã®ããã¥ã¡ã³ãããïŒ
éåžžã¯ãforceUpdateïŒïŒã®äœ¿çšããã¹ãŠé¿ããrenderïŒïŒã®this.propsãšthis.stateããã®ã¿èªã¿åãããã«ããŠãã ããã
å®éãReactã¬ã€ãã§ã¯ãç¶æ ãçŽæ¥æŽæ°ããªãããã«æ瀺ãããŠããŸãïŒ https ://facebook.github.io/react/docs/state-and-lifecycle.html#do -not-modify-state-directly
forceUpdate
ã¯ãç§ãèªãã ããã«ãã³ã³ããŒãã³ããå°éå
·ãå·ã®ããŒã¿ã«åºã¥ããŠããªãå Žåã«ãã³ã³ããŒãã³ãã匷å¶çã«æŽæ°ããããã ãã®ãã®ã§ãã
@patsissonsç§ã¯ééã£ãŠãããããããŸããããSemVerã¯APIããã³ã»ãã³ãã£ãã¯ã€ã³ãã³ããšã®äžäœäºææ§ãããããã«èšèšãããŠãããšæããŸãã æå³ãããŠããªãæ¹æ³ã§ã©ã€ãã©ãªã䜿çšããŠãããããšãã£ãŠïŒããã¥ã¡ã³ãã«ãããšïŒãã©ã€ãã©ãªãåè¿°ã®æå³ããªã䜿çšããµããŒããç¶ããå¿ èŠããããšããæå³ã§ã¯ãããŸããã ã©ã€ãã©ãªã®äœæè ã¯ãSemVerã®ç¯å²å ã§ã誀ã£ãŠãããããŸããŸäžéšã®äººã䜿çšããã»ãã³ãã£ã¯ã¹ãå€æŽã§ããŸãã
ããã¯èšã£ãŠããããããReadonly<>
ããstate
ãžã®å€æŽã¯å€§ããããŸããããããæ£ããå€æŽã§ãããšå°ãã®éèããŠã¿ãŠãã ããã ãã€DefinitelyTypedã«ãªãªãŒã¹ããå¿
èŠããããŸããïŒ æçµçã«state
ãReadonly<>
$ãšããŠããŒã¯ããæŽæ°ãååŸãããšãã³ãŒããå€æŽããå¿
èŠãåžžã«ãããŸãã
Readonly<>
ãstate
ã«é©çšãããŠããããšã«ã€ããŠãç§ã¯ãŸã äœãæ£ããã®ãããããŸãããããã«ãããsemverãããŒã«ãªã©ã«ã€ããŠè°è«ããã®ãé£ãããªããŸãã ç§ã®çŽæã¯ãããæ£ããã£ããšããããšã§ããã å€æŽãã¬ãã¥ãŒãã人ã
ã¯ããããåé¡ãšããŠåãäžããããšã¯ãããŸããã§ããã ReactããŒã ã®æå³ãšäžèŽããŠããããã§ãã
DefinitelyTypedã§ã®åå¿ã«ã€ããŠã¯ãã¬ãã¥ãŒæ åœè ã®ããããã«ä»»ããããšãã§ããŠããããã§ãïŒäžèšã®ãã¹ãŠãccããŸããïŒã
ã§ã¯ãObservableã¯forceUpdateã®ç¶æ ãå€æŽããŸããïŒ ãããã£ãŠãç¶æ ã匷å¶çã«å€æŽããããšã¯ãããçšåºŠèš±å¯ãããŠããŸãã
èªã¿åãå°çšã䜿çšããå Žæã100ïŒ å®çŸ©ãããŠããªãããšãç解ããŠããŸãã ããããããŒã«ã®æºåãæŽãåã«ãç©è°ãéžã倧éã«äœ¿çšãããããããã£ããå§ããå¿ èŠããããŸããïŒ
ç§ã¯ãã¹ãŠåŒ·ãåä»ããããŠããã®ã§ããã¹ãŠstrictNullChecksã䜿çšããŠ6ã€ã®ãããžã§ã¯ãã管çããŠããŸãããããã§ã®å©ç¹ã¯ãçŸåšçºçããŠããåé¡ãããã¯ããã«å°ãããã®ã§ãã
@ericanderson SemVer2ã¯ã ^15.0.0
ã®ãããªããŒãããŒãžã§ã³å®£èšãèš±å¯ããããã«èšèšãããŠãããã¢ãžã¥ãŒã«ãžã®ãã€ããŒã¢ããã°ã¬ãŒããŸãã¯ãããã¢ããã°ã¬ãŒãïŒã€ãŸãã 15.0.1
ãŸãã¯15.1.0
ïŒãééçãŸãã¯å°ãªããšãå€éšã®èŠ³ç¹ããã¯äžäœäºææ§ããããŸãã ã¡ãžã£ãŒã¢ããã°ã¬ãŒãïŒ 16.0.0
ïŒã§ã¯ãå€æŽãå ããããã«ããŒãžã§ã³å®£èšã調æŽããå¿
èŠããããŸãã ããã¯æ¬è³ªçã«ãã¿ã€ãã³ã°ã·ã¹ãã ã«æã¡èŸŒãŸããããšããã®ç Žå£çãªå€æŽãã²ãŒãããŸãã ãã ããçŸåšãåå®çŸ©ããŒãžã§ã³ã¯ãããããã®ã¢ãžã¥ãŒã«ããŒãžã§ã³ã®ã¡ãžã£ãŒããŒãžã§ã³ïŒæ
£äŸã«ããïŒããéžè±ããããšã¯ã§ããŸããããã®ããããã®äžé£ç¶æ§ãçºçããŸãã
çãããŒãžã§ã³ã§ã¯ãã¿ã€ãå®çŸ©ã«ã¯ãã¢ãžã¥ãŒã«èªäœããŸã£ããå€æŽããã«é倧ãªå€æŽãå°å ¥ããããšãã§ããé倧ãªå€æŽã«ã¯ã¡ãžã£ãŒããŒãžã§ã³ã®ãã³ããå¿ èŠã§ãã
ããããããªãã¯forceUpdateãåé€ããPRãäœæããŸããããïŒ
次ã«ãforceUpdateãååšããå Žåã¯ãç¶æ ãå€æŽããå¿ èŠããããŸãã
çè«çã«ã¯ãæ·±ãäžå€ã®ç¶æ ã°ã©ãã䜿çšããå¿ èŠããããŸãããç¶æ ã匷å¶çã«å€æŽããããšã¯åé¡ãªãããã¹ãŠã®éçºè ãæ°žç¶ããŒã¿æ§é ã®ã¢ã€ãã¢ã«è³æããããã§ã¯ãããŸããã
幞ããReactã¯ã¹ã±ãŒãã«ãŒããèš±å¯ããç¶æ ãçŽæ¥å€æŽããããšãå¯èœã«ããŸããTSéçºè ããã®ã«ãŒãã䜿çšããããšãçŠæ¢ããŸããïŒ ããã¯ããŸãã«ãç¶æ§çã§ã¯ãããŸãããïŒ
ããšãã°ãVue.jsã¯å¿ é ã®å€æŽãä¿é²ããŸãããReactã«åœ±é¿ãäžããŠãé©ããªãã§ãããã
ãŸããç§ã¯å°ãåã«Reactã®äœè ã®ããã°æçš¿ãèªãã§ããŸããïŒæãåºãããšãã§ããŸãïŒã
ãã以å€ã®ç§ã®ç«å Žã¯ãåå®çŸ©ãã§ããã ãæ©ãå ¬éããããšã§ããç§ã®å¯äžã®é¢å¿äºã¯èªååã§ãã ã¿ã€ãå®çŸ©ã®ããŒãžã§ã³ç®¡çã®çŸåšã®ç¶æ ãèãããšããœãŒã¹ãå€æŽããã«åŸç¶ã®ãã«ããäžæããå¯èœæ§ãããããã§ãã ãããã®ã¿ã€ãã®é決å®è«çCIé害ã¯åä»ã§ãã 圌ããå€æŽãããã·ã¥ãããã«ãã®äžæãšã¯äœã®é¢ä¿ããªãå€æŽã®æãèŠã€ããã®ã§ã誰ããã«ãã®äžæãèŠãããããŸããã
ãã®äžã§å¯ãåŸãç§ã®å人çãªæèŠã¯æ¬¡ã®ãšããã§ãã
äžèšã®èããšéæšæºã®Reactã¢ããªã®åé¿çãèãããšãReadonlyã¯æ£ãããšæããŸããå®å šãæãããã«å¿ èŠãªå€æŽã¯ãã©ã€ããµã€ã¯ã«ã¡ãœãããäžèŽããããã«æŽæ°ããããšã ãã§ãã
ãããã®å€æŽãå®å šã«çã«ããªã£ãŠããããšã«åæããŸããåé¡ãåŒãèµ·ãããŠããç§ã®ãŠãŒã¹ã±ãŒã¹ã¯ããã£ãã«ééããªãéåžžã«ãŠããŒã¯ãªã³ãŒããŒã±ãŒã¹ã§ããã ã³ãŒãããŒã¹ãèªã¿åãå°çšã®å°éå ·ãšç¶æ ã«é©åãããããšã§ãä»ã®æ¹æ³ã§ã¯æ€åºã§ããªãã¿ã€ãã³ã°ã®åé¡ãããã€ãèŠã€ããŸããã å€æŽãå ¬éããããšãæ£ããéžæã§ãã£ãããšã¯ééããããŸããã
PatsissonãVSãVS CodeããŸãã¯ãã®ä»ã®ãšãã£ã¿ãŒã䜿çšããŠããŸããïŒ
ç§ã®ãã€ã³ãã¯ãReactã¯æ©èœçãªã¢ãããŒããä¿é²ããŸããããããªã²ãŒã ã®ãããªã¯ãŒã¯ãããŒãå¯èœã«ããäžçã«åŒ·å¶çã«å€æŽãå ãïŒstateïŒã次ã«ã¬ã³ããªã³ã°ããïŒforceUpdateïŒãšããããšã§ãã ãã®ã¢ãããŒãã¯çŸåšTSã§ã¯çŠæ¢ãããŠããŸãã äžçš®ã®æ©èœ-ãã¡ã³ã¿ãªãºã :)
次ã«ãçŸåšã®ãšã³ã·ã¹ãã ãæ©èœãããããã®ä»£æ¿æ¡ãèããŸã...
åé¡2ã¯strictNullChecks
ã§ã®ã¿ãšã©ãŒãã¹ããŒããŸãã
[TS] Cannot invoke an expression whose type lacks a call signature. Type '((val: any) => void) | undefined' has no compatible call signatures.
+1ç§ã¯strictNullChecksã䜿çšããŠããŸã
@ericanderson ïŒ
äžèšã®ããã«ãããã¯ããŒã«ã«é¢é£ããŠãããæããã«DTã®ç¯å²å€ã§ãã VSCodeã䜿çšããŠããŠã次ã®TSããŒãµãŒã®ãã¬ãã¥ãŒãã€ã³ã¹ããŒã«ããå Žåãäžèšã®ãããããèšè¿°ããŠãããšãã«ãstrictNullChecksã§ãã®åé¡ã¯çºçããŸããã§ããã
ç§ã¯çªãæã£ãŠããªãã®ã§ãVSã«é©åã«è©±ãããšãã§ããŸããã
ãã®Pick
ãããã¯ãVSCodeã§ã®ææ¡ãç ŽããŸããã this.setState({ | })
ïŒCtrl + SpaceïŒãå®è¡ãããšãç¶æ
ãæ確ã«å®çŸ©ããã setState
ãã¡ã³ããŒã®ç¶æ
ãéžæçã«èšå®ã§ããããã$ Partial<State>
ã䜿çšããŠããŠããäœã衚瀺ãããŸããã
ç§èŠæ£ããã³ãŒãã¯setState(state: Partial<S>, callback?: () => any): void;
ã§ããå¿
èŠããããŸã
å ã®ãã«ãªã¯ãšã¹ããã©ã³ãã§èª¬æããããã«ãPartialããå§ããŸããã ãã ããç¶æ ãªããžã§ã¯ãã次ã®å ŽåïŒ
ã€ã³ã¿ãŒãã§ã€ã¹ã®ç¶æ
{
fooïŒæåå;
}
次ã«ãpartialã䜿çšãããšã次ã®ããšãã§ããŸãã
setStateïŒ{fooïŒundefined}ïŒ;
ããã¯æããã«ééã£ãŠããŸãã
ç³ãèš³ãããŸããããèªã¿åãå°çšã«ã€ããŠã§ã
Reactã¯ReduxãšsetStateã ãã§ã¯ãããŸããã Reactã¯mobxããã®ä»ã®èŠ³å¯å¯èœãªãã¿ãŒã³ã§ããããç¶æ ããããã£ã®å²ãåœãŠãäž»ãªæ©èœã§ãã è°è«ãããå€æŽã¯ãtypescriptã§mobxã®äœ¿çšãå®å šã«æ®ºããŸãã
ã§ã¯ããªãå ã®Reactã³ãŒãã«ååšããªãåäœã.d.tsãã¡ã€ã«ã«è¿œå ããã®ã§ããããã .d.tsã¯å ã®ã©ã€ãã©ãªãåæ ãããã®ã§ãããèè ã®èŠ³ç¹ã«ããã°ãæ£ããã³ãŒãã£ã³ã°ã¹ã¿ã€ã«ã人ã ã«æãããã®ã§ã¯ãããŸããã
@lezious ãç§ã¯ããªãã®ç«å Žãç解ããŠããªãã®ã§ã¯ãªãããšæããŸãã ã³ãŒããµã³ãã«ãæäŸã§ããŸããïŒãŸãããµã³ãã«ã«é¢ããã¿ã€ãã³ã°ã«ã€ããŠäœãå£ããŠããŸããïŒ ããããšãïŒ
åé¡ãªãïŒ
ããã¯ç§ã®å·ã®ã¯ã©ã¹ã§ã
class UserInfoBlockState
{
<strong i="7">@observable</strong> <- this is mobx way to declare state
public updating: boolean;
<strong i="8">@observable</strong>
public deleted: boolean;
}
ãããç§ã®ã³ã³ããŒãã³ãã§ã
<strong i="12">@observer</strong> <-- this is mobx way to make component react to state change
export class UserPanel extends React.Component<IUserInfoBlockProps, UserInfoBlockState>
{
......
private updateUser()
{
this.state.updating = true;
UsersAPI.update(this.props.user)
.then(() =>
{
this.state.updating = false; <--- this is the mobx way to work with the state
}
).catch(() =>
{
this.showErrror("Server error");
this.state.updating = false;
});
}
....
}
ãããŠä»ãç§ãã¡ïŒreact + mobxã§æžããã巚倧ãªãããžã§ã¯ããæã€ç§ãã¡ã®äŒç€ŸïŒã¯ãæ°ãããªãªãŒã¹ãµãŒã¯ã«ã®éå§æã«DTãšReactãæŽæ°ããŸãã...3000以äžã®ã³ã³ãã€ã«ãšã©ãŒãããããã£ã¯èªã¿åãå°çšã§ããã ããã ããªããç§ã«ææ¡ããããš-ãããžã§ã¯ãå šäœãreduxã«æžãçŽããreact.d.tsãæŽæ°ããªãããåžžã«ãã©ãŒã¯ããŒãžã§ã³ãç¶æããŠãµããŒãããŸããïŒ
@mweststrate ãplzããããã§ãã¯ããŠãã ããã
@Ieziousããªãã®ç«å Žã«æè¬ããèœã¡çããŠãã ããã ç§ã¯ããªããšäžç·ã«ä»äºãããããšããŠããŸãã ããã¯Reduxãšã¯äœã®é¢ä¿ããããŸããããçŽç²ãªReactã§ãã
DTã以åã«æ©èœãããŠãŒã¹ã±ãŒã¹ããããã¯ããããªãã®ã§ãããreactã§ã®mobxã®äœ¿çšãã©ã®ããã«èª¬æãããã¯ãreactã®ããã¥ã¡ã³ãïŒãŸãã¯ãç§ãèªãã ä»ã®mobxã®ããã¥ã¡ã³ãïŒãšäžèŽããŠãããšã¯æããŸãããããïŒã
Reactã¯ãããã¥ã¡ã³ãã§ç¶æ ãæ£ãã䜿çšããæ¹æ³ã3ã€ããããšãæ確ã«è¿°ã¹ãŠããŸããæåã®æ¹æ³ã¯ããç¶æ ãçŽæ¥å€æŽããªããã§ãã
ããã«ãããã³ãŒãããŒã¹ãçŸåšæ©èœããŠããæ¹æ³ããreactã®å°æ¥ã®ããŒãžã§ã³ã§æ©èœããªããªãå¯èœæ§ãéåžžã«é«ããšç§ã¯ä¿¡ããŠããŸãã https://github.com/mobxjs/mobx-reactã調ã¹ãŠãããã®ããã«ç¶æ ã䜿çšãããšããææ¡ã¯èŠåœãããŸããã å®éã圌ãã¯ããªãã«ããããã£ã䜿ã£ãŠæ¬²ããããã§ãã
https://mobx.js.org/getting-started.htmlã確èªãããmobx react stateããã°ãŒã°ã«ã§æ€çŽ¢ããŸããããmobxãçŸåšã®æ¹æ³ã§äœ¿çšããããšãææ¡ããããã¥ã¡ã³ãã¯èŠã€ãããŸããã§ããã
DTã¯ãåºç€ãšãªãã©ã€ãã©ãªã®ç²Ÿç¥ãããäŒããå®éã®å®è£ ãææªã®å Žåã«äŒããããšã«ãªã£ãŠããŸããåå¿ããŠã³ã³ããŒãã³ããæ¡åŒµããããšã¯ãæé»ã®å¥çŽãå°éããããšãæå³ããããšã¯æããã§ãã
äœãããã°ããã®ãããããŸããã ç§ãæã«è² ããªããšèããããšãã§ããããã€ãã®ãªãã·ã§ã³ïŒ
state
å€æ°ãåŒãç¶ãããšã䞻匵ããå Žåã®ãå®äŸ¡ãªããªãã·ã§ã³ã¯ã$ React.Component
ãæ€çŽ¢ããŠMyComponent
ã«çœ®ãæãã$ MyComponent
ããµãã¯ã©ã¹ãšããŠå®çŸ©ããããšã§ããèªã¿åãå°çšã®å¶çŽãªãã§React.Component
ã®ãthis.state
ã®äœ¿çšãåæ¢ããå®éã®React.Component
ã®å€æ°ã䜿çšããããšã§ãã ããã¯å°ãé¢åãããããŸããããå°ãªããšããããžã§ã¯ãã®æ°ãã人ã
ã¯ããªã³ã©ã€ã³ã§èª¬æãããŠããããã«ãã³ãŒãããŒã¹ã®ãã¿ãŒã³ãèŠãããšãã§ããŸããstate
ãå宣èšã§ããŸããthis.state
ãæ€çŽ¢ããŠthis.somethingElse
ã«çœ®ãæããæåã§å®£èšããããšãã§ããŸãããããããç§ã®ãããžã§ã¯ãã ã£ãããç§ã¯ãããã2çªç®ã®ããšãããã§ããããã確ãã«ç¥ãããã«mobxã«ã€ããŠååã«ç¥ããŸããã
ç³ãèš³ãããŸããããç§ã¯ããªãã«åæããããšãã§ããŸããã§ããïŒä»ã®äººãããªãã«åæããªããšããæå³ã§ã¯ãããŸããïŒã ãã®éšåãå ã«æ»ãçç±ãèŠã€ããããšããŸããããçŸæç¹ã§ã¯ä¹è¹ã§ããªãããã§ãã
Reactã®ç¶æ å€åãšmobxãã¿ãŒã³ã«éåžžã«ãã䌌ãã¬ã³ããªã³ã°ãé§åããããã®RxJãªãã¶ãŒããã«ã®ã«ã¹ã¿ã ã¢ããªã±ãŒã·ã§ã³ã§ããç§ãã¡ã®æŠç¥ã«ã€ããŠããäžåºŠèª¬æããŸãã ã¢ã¯ã·ã§ã³ã䜿çšããŠããã¥ãŒïŒReactïŒã¬ã€ã€ãŒããå ¥åãåãåããŸãã ã¢ã¯ã·ã§ã³ã¯ãå ¥åãæ¶è²»ããŠãªãã¶ãŒããã«ãçæããé¢æ°ãšå矩ã§ããããªãã¶ãŒããã«ã¯ä»ã®ç¶æ ã®ãªãã¶ãŒããã«ãããã«é§åããŸãã ãã®ãã¿ãŒã³ã«ãããç£èŠå¯èœãªå€ãç §äŒããŠç¶æ ã¢ã¯ã·ã§ã³ãå®è¡ããã ããªã®ã§ãReactã¬ã€ã€ãŒã®èŠ³ç¹ããç¶æ ãäžå€ã®ãŸãŸã«ããããšãã§ããŸãã å éšç¶æ ã«ã¯èªã¿åãå°çšã®å¶çŽããªããããå éšçã«ã¯ãã¢ã¯ã·ã§ã³ã®çµæãšããŠç¶æ ããå€åãããå¯èœæ§ããããŸãã
èœã¡çããªãã ç§ã¯ãããžã§ã¯ããæ¬çªç°å¢ã§äœ¿çšããŠãããããŒã ã«èšå€§ãªæéãè²»ããå¿ èŠããããŸããããã¯ããã®å€æŽä»¥éããéãæå³ããŸãã
ãããŠããã®çç±ã¯äœã§ããïŒ ãã®å€åã¯ãåå¿ã®çŸå®ãåæ ããŠããŸããïŒ ããããããã¯ãreactã«ã¯ååšããªãå¶éãšåäœãè¿œå ããŸããããã¯ã圌ããããæ£ãããšæã£ããšããçç±ã ãã§ãäœããã®åœ¢ã§è¿œå ãããå¶éã§ãã
DTãããžã§ã¯ãã®ç®çã¯äœã§ããïŒ JSã©ã€ãã©ãªãå¯èœãªéãæ£ç¢ºã«èª¬æããã®ãããããšããããã®ã©ã€ãã©ãªãæ£ãã䜿çšããæ¹æ³ã«ã€ããŠã®ç§ãã¡ã®ããžã§ã³ã説æããã®ã§ããïŒ ãDefinitelyTypedããšããååã«ãããšããããæåã§ãã ãããã£ãŠããã®å¶éãå ã®JSã©ã€ãã©ãªã«ååšããªãå Žåã¯ãDTã«ãååšããŠã¯ãªããŸããïŒMUSTNOTïŒã ãããç§ã®ãã€ã³ãã§ãã ãã®ç¹ã§ç§ã¯ã©ããééã£ãŠããŸããïŒ
äžæºãæããŠãããšã®ããšã§ãããããã¯ãããã¥ã¡ã³ããèªãã§åå¿ã䜿çšããããšãç®çãšããæ¹æ³ã§ãã ããªãã®ããŒã ãã©ã€ãã©ãªãæªçšããæé»ã®å¥çŽã«éåãããããDTãããå ·äœçã«ããæ¹æ³ãããããŸããã
ç¶æ ãçŽæ¥å€æŽã§ããããã«ããå¿ èŠãããããšã瀺åãããreactããŒã ãåºãã1ãªã³ã¹ã®ããã¥ã¡ã³ããèŠããŠãã ãããããã«ã³ãŒããå ã«æ»ããŸãã
https://facebook.github.io/react/docs/react-component.html#state
this.stateãçŽæ¥å€æŽããªãã§ãã ãããåŸã§setStateïŒïŒãåŒã³åºããšãè¡ã£ãå€æŽã眮ãæããããå¯èœæ§ããããŸãã this.stateãäžå€ã§ãããã®ããã«æ±ããŸãã
reactãthis.state
äžå€ãšèŠãªããŠããããšã¯ããªãæãããªããã§ãã Reactã¯this.state
ã®_properties_ãäžå€ãšã¯èŠãªããŸããïŒããã¯reduxã®ä»®å®ã§ãïŒã ããªãã¯èªç±ã«è¡ãããšãã§ããŸãïŒ
this.state.user.name = "foo";
æ £çšçãªåå¿ã§ã
ç§ã®å¥œã¿ã¯ãAPIãæ£ç¢ºã«å
¥åãïŒãã®å Žåã¯Readonly
ãæå³ããŸãïŒãåå¿ããŒã ãè¿°ã¹ãŠãããã¹ãŠã®äžå€æ¡ä»¶ãè¡šçŸããããšã§ãã
@ericandersonç³ãèš³ãããŸããããç§ã¯ããã«æ°ã¥ããã ãã§ãã FWIWå€æŽã¯åççã§ãããããŒã«ãè¿œãã€ããšæããŸãã by byãšããŠããªããžã§ã¯ããååŸããsetState
ãªãŒããŒããŒãã®å»æ¢ãæ€èšããŠãããšèããããšã¯ãããŸããïŒ å°æ¥ã¯ããã¹ãŠã®ã¢ã«ãŠã³ãã«ããåæžã¹ã¿ã€ã«setState
ã§ãã
@amorelandåæããŸããã ãããïŒ https ïŒ//facebook.github.io/react/docs/state-and-lifecycle.html#do -not-modify-state-directly
ç¶æ ãçŽæ¥å€æŽããªãã§ãã ãã
ããšãã°ãããã¯ã³ã³ããŒãã³ããåã¬ã³ããªã³ã°ããŸããã
// Wrong this.state.comment = 'Hello';
代ããã«ãsetStateïŒïŒã䜿çšããŠãã ããã
// Correct this.setState({comment: 'Hello'});
this.stateãå²ãåœãŠãããšãã§ããå¯äžã®å Žæã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã§ãã
@johnnyreillyç§ã¯ããŠããŸããã§ããã ããã¯é¢çœãã ãœãŒã¹ïŒ
æè¿ã®Reactã«ã³ãã¡ã¬ã³ã¹ã§ã®è¬æŒã®1ã€ã§åãäžããããŸããã YouTubeã§å ¥æã§ããŸãã ãªã³ã»ã¯ã©ãŒã¯ã®è©±ã ã£ãã®ãããããŸããã 1æ¥ç®ã®æåã®è¬æŒã®1ã€-v16ã«å¯Ÿå¿ããããã®ä»åŸã®å€æŽã«ã€ããŠèª¬æããŸãã ãã¡ã€ããŒãªã©
https://www.reddit.com/r/reactjs/comments/5zqgsb/react_fiber_functional_setstate/ããã§@gaeronãèšå
ç³ãèš³ãããŸããã@gaearonç§ã¯æå³ããŸãã
mobxãç¶æ
å€æŽãå®è¡ããŠããçç±ã¯ããªãã¶ãŒããã«ãç¶æ
ãå®å
šã«_眮æ_ããã®ã§ã¯ãªããReactæŽæ°ãé§åããŠãããããç¶æ
ãã¬ã³ããªã³ã°ãé§åãããšã³ãžã³ã«ãªãããã§ãã ãããã£ãŠã this.state.updating = true;
ã®ãããªããšãè¡ãããšã§ãå®éã«ã¯ç¶æ
ã®çœ®æãšåçã®ããšãè¡ããŸããã代ããã«ãç¶æ
ã以åã®ã³ã³ãã³ãããå€æŽãããããšãã³ã³ããŒãã³ãã«éç¥ããããšã§ãæ°ããã¬ã³ããªã³ã°ãããªã¬ãŒããã®ã«ååãªã¹ããŒããªç¶æ
ã«ãªããŸãã ç§ã¯ãããã_åŸæ¥ã®_Reactã®äœ¿çšæ³ã§ã¯ãªããReactã®ã¯ããã«å
æ¬çã§é«ã¬ãã«ã®äœ¿çšæ³ã§ããããšã«åæããŸãã åŸæ¥ã®Reactã®äœ¿çšæ³ã¯ãå°æ°ã®ã³ã³ããŒãã³ããå«ãå°ããªãããžã§ã¯ãã«ã®ã¿åœ¹ç«ã€ãšç§ã¯äž»åŒµããŸãã ãããããæ°åã®ãªã¢ã¯ãã£ããã¥ãŒããŒã·ã§ã³ãã©ã€ããŒãæã€æ°çŸã®ã³ã³ããŒãã³ãã§çµãããšãåŸæ¥ã®Reactç¶æ
ã®å€æŽïŒã€ãŸããsetStateïŒã確å®ã«äœ¿çšã§ããªããªãã_smart_ç¶æ
ïŒmobxãæ¬è³ªçã«è¡ãããšïŒãå«ãã¢ãŒããã¯ãã£ã®å€æŽã楜ããŸãªããã°ãªããŸããã ïŒã
ããã¯èšã£ãŠããã¿ã€ãã³ã°ã®å€æŽãReactã·ã¹ãã ã®ããé«åºŠãªäœ¿çšæ³ã«åœ±é¿ãäžããŠããããã圌ãåæºããŠããçç±ãç解ããŠããŸãã ç£èŠå¯èœãªç¶æ ã®å²ãåœãŠã¯ãæè¡çã«ã¯ãå€åãããç¶æ ã§ã¯ãªããRHSå€ã®ç£èŠå¯èœãªã€ãã³ããåŒã³åºããŸãã mobxããããã®èŠ³å¯å¯èœãªã€ãã³ããçºè¡ããããã«éžæããæ§æããReactã®äžå€ç¶æ ã®æ瀺çãªæå³ãšççŸããã®ã¯å¶ç¶ã§ãã
@Ieziousãã®ã¿ã€ãã®åé¡ã®è¿
éãªä¿®æ£ãå¿
èŠãªå Žåã¯ãReactåãæ¡åŒµããã³ã³ããŒãã³ãããªãã¡ã¯ã¿ãªã³ã°ããŠReact.Component
ådefã®æ¡åŒµæ©èœã䜿çšããããšã§åé¡ãåé¿ã§ããŸãã
import * as React from 'react';
declare module 'react' {
class MutableStateComponent<P, S> extends React.Component<P, S> {
state: S;
}
}
(React as any).MutableStateComponent = React.Component;
ããã§ã state
ã¡ã³ããŒãreadonly
ãšããŠããŒã¯ãããªããªã£ãããšãé€ããŠãéåžžã®ã³ã³ããŒãã³ããšåãããã«å¯å€ç¶æ
ã³ã³ããŒãã³ããäœæã§ããŸãã
export class MyComponent extends React.MutableStateComponent<MyProps, MyState> {
// this.state.name is writable
}
@patsissonsã¯ãããŸãã«ãã®çç±ã§ãã
ç¶æ ãå€æŽããã®ã§ã¯ãªããsetStateãåŒã³åºãmobx observablesã䜿çšããŠããŸããããã¯ã巚倧ãªãããžã§ã¯ãã³ãŒããã¯ããã«æ確ã§ç解ããããããã«èŠããããã§ãã
ç§ã¯èªåã®ã³ã³ããŒãã³ããäœæã§ããããšãç¥ã£ãŠããŸãããŸããnpmãµãŒããŒã§ã¹ã¯ãªãããäœæããããšãã§ããŸãããã®ã¹ã¯ãªããã¯ãäŒç€Ÿã®ãã®å€æŽãåžžã«å ã«æ»ããŸãã ãthis.state.state.updatedãã®ãããªããã¯ãä»ã®å€ãã®ããã¯ã䜿çšã§ããŸãã
ãã®å€æŽã¯ãå®éã«ã¯åå¿æ¹æ³ã«åŸãmobxã®ãããªèŠ³å¯å¯èœãªãã¿ãŒã³ã®äœ¿çšã«åœ±é¿ãäžãããšèšãããã®ã§ãããçŸåšããã®å€æŽã¯ã³ã³ãã€ã«ã§ãããåäœããããã«ããã€ãã®ããã¯ãšåé¿çãå¿ èŠã§ãã ãã®ããããã®å€æŽã¯æ£ãããªããšæããŸãã
ãããããç§ã®ææ¡ãMutableStateComponent
ã®ä»£ããã«ãObservable Reactãã¿ãŒã³ãšããæŽåæ§ã®ããObservableComponent
ãšåŒã³ãŸãã
Readonly
ããããããããšãéåžžã®åå¿ã§åå¿ã¿ã€ãã䜿çšããŠãã人ïŒããã³/ãŸãã¯mobx以å€ã®ä»»æã®æ°ã®ä»ã®ç¶æ
管çã·ã¹ãã ïŒããšã©ãŒã«ãããããŸãã ç§ã¯å·šå€§ãªãããžã§ã¯ãã§mobxã䜿çšããŠããŸããã誰ããã¿ã€ããã¹ãããŠã誀ã£ãŠthis.state.foo = bar
ã䜿çšããå Žåã®ã³ã³ãã€ã©ãšã©ãŒã«æè¬ããŸãã
æšæºã®åå¿ãšéæšæºã®åå¿ã®äœ¿çšã®éã«é¿ããããªããã¬ãŒããªããããå Žåãæšæºã®åå¿ã¿ã€ãã¯åè ã«åŸãã¯ãã§ãã
ããã«ãmobxãæ £çšçãªæ¹æ³ã§äœ¿çšããå Žåãããã¯åé¡ã§ã¯ãããŸããã
èªã¿åãå°çšãåé€ãããšãéåžžã®åå¿ã§åå¿ã¿ã€ãã䜿çšããŠãã人ïŒããã³/ãŸãã¯mobx以å€ã®ä»»æã®æ°ã®ä»ã®ç¶æ 管çã·ã¹ãã ïŒããšã©ãŒã«ãããããŸãã ç§ã¯å·šå€§ãªãããžã§ã¯ãã§mobxã䜿çšããŠããŸããã誰ããã¿ã€ããã¹ãããŠã誀ã£ãŠthis.state.foo=barã䜿çšããå Žåã®ã³ã³ãã€ã©ãšã©ãŒã«æè¬ããŸãã
ã ããããäžåºŠ-ããªãã¯ã³ãŒããæžãããšãæããŠããŸã
ãã®ãããžã§ã¯ãã¯ãã³ãŒãã®èšè¿°æ¹æ³ãæããããšã§ã¯ãªããJSã©ã€ãã©ãªã®æ¢åã®æ©èœã説æããããšãç®çãšããŠããŸãã 説æããå¶éã¯å ã®ã©ã€ãã©ãªã«ã¯ååšããªããããåé€ããå¿ èŠããããŸãã
ããã§å šéšã§ãã
@patsissons
ãã®ã¿ã€ãã®åé¡ããã°ããä¿®æ£ããå¿ èŠãããå Žåã¯ãReactåãæ¡åŒµããã³ã³ããŒãã³ãããªãã¡ã¯ã¿ãªã³ã°ããŠReact.Componentådefã®æ¡åŒµæ©èœã䜿çšããããšã§åé¡ã解決ã§ããŸãã
æ£ãããããŸããã ç§ãããäŒæ¥ã®äžçã§ã¯ããè¿ éãªä¿®æ£ãã¯ãããŸããã SDKã§äœããå€æŽãããå ŽåããŸãã¯äžäœäºææ§ãå¿ èŠãªå ŽåããŸãã¯äœå¹ŽãããããŸãã 2M以äžã®ã³ãŒããããžã§ã¯ãã«ã¯è¿ éãªä¿®æ£ã¯ãããŸããã äœé±éã«ããããå€æŽããã¹ããA / B補åãã¹ããå€æ°ã®äººã ãžã®å±éã§ãã å®è²»ãããããŸãã ãããŠã誰ããå®éã®ã©ã€ãã©ãªã«ååšããªãäžäœäºææ§ã®ãªãå€æŽãè¿œå ãããšããçç±ã ãã§ããã®èšå€§ãªåªåã¯ãã¹ãŠãããŸããïŒ
ãªãforceUpdateãreactã«ãŸã ååšããŠãããšæããŸããïŒ åœŒãã¯æ£ããã¹ã¿ã€ã«ã«ã€ããŠconfsã«ã€ããŠè©±ããŠããããä»ã®äœ¿çšæ¹æ³ãé²ãããã«å€æŽãå ããŠããã ãªãã§ïŒ ããã¯å€§äŒæ¥ã§ãããã©ã€ãã©ãªã¯äžäœäºææ§ããªããã°ãªããªãããšã圌ãã¯ç¥ã£ãŠããããã§ãã
@ericandersonã¯ãããæžãã
this.state.state.value = 1
圌ã®èŠ³ç¹ãããåæ³ã§ã¯ãããŸããã 次åã圌ã¯TSããããŒã«ãå ¥æãããã®ã³ãŒãã劚ããå¶éãè¿œå ããŸãã ãŸãã¯ãããããæ£ããã¹ã¿ã€ã«ã§ããã人ã ãééããç¯ããªãããã«ããããšããçç±ã ãã§ãã³ã³ããŒãã³ãã®æçµã¯ã©ã¹ãªã©ãäœæããŸãã
人ã ãäžæ£è¡çºãããã®ãé²ã-ããã¯FBã®ä»äºã§ãã圌ããããããããã®ã§ããã°ã圌ãã¯ç°¡åã«ãããã·ãè¿œå ããç¶æ ã®å€åãçŠæ¢ããããšãã§ããŸãã DTã®ç®çã¯ã説æãè¿œå ããããšã ãã§ãã
@Iezious
éèŠãªã®ã¯ãReactããŒã ã¯JavaScriptã§ç¶æ ãäžå€ã«ããããšã¯ã§ããªããšããããšã§ãããã§ããã°ããããããšãã§ããŸãã äžæ¹ãTypeScriptã¯ç¶æ ãäžå€ã«ããããšãã§ããããããã®å€æŽãåå®çŸ©ã«å ããããã®ã¯ãã®ããã§ãã å·ã®ã¡ã³ããŒã«çŽæ¥å€æŽãèš±å¯ããªãããšã¯ReactããŒã ã®çµ¶å¯Ÿçãªæå³ã§ãããïŒå·ã®æ£ãã䜿çšã«é¢ããå ¬åŒããã¥ã¡ã³ãã§æããã§ãïŒããã®å¶çŽã課ãããã®èšèªæ§é ããããŸããã§ããã ãã®å¶çŽã¯æ±ºããŠæªç¥ã§ã¯ãªããæåããååã«ææžåãããŠããŸãã Reactã®_åŸæ¥ã®_䜿çšæ³ä»¥å€ã§æäœããŠããç§ãã¡ã®å Žåãå°ãªããšãReactã®å ¬åŒäœ¿çšæ³ã®æšå¥šäºé ãé å®ããå¿ èŠããããŸãã ç§ã®ããŒã ã«ãšã£ãŠãããã¯ãç¶æ ãçŽæ¥å€æŽããã«ç¶æ ã®å€åãä¿é²ã§ãããœãªã¥ãŒã·ã§ã³ãèšèšããããšãæå³ããŸããã ããã¯ç¹ã«ããã®ãããªåé¡ãçºçããªãããã«ããããã«è¡ãããŸããïŒãã®å€æŽã¯ãããã«åœ±é¿ããŸããããåºæ¬çãªèšèšã§ã¯ãªããé¢æ°ã®ã·ã°ããã£ãä»ããŠã®ã¿åœ±é¿ããŸããïŒã
ã䜿çšã®ç¶æ³ã§ãªãã¡ã¯ã¿ãªã³ã°ãäžå¯èœãªå Žåã¯ãå€æŽãè¡ãããåã«@types/react
ã15.0.1
ã«åºå®ãããã @types/react
ã䜿çšããã«ã代ããã«ç¬èªã®ããªã¢ã³ããç¶æããŠãã ããã defsãšå
¥åãã state
ã®å
¥åãComponent
ã«å€æŽããã ãã§ãã å€æŽãå
ã«æ»ãããã«èª¬åŸããããšã«æåããããšã¯ãªããšæããŸãã
forceUpdate
ãååšããã®ã¯ãå
éšæ§é ç¶æ
ãå€æŽããããšãïŒãŸãã¯ã render()
ãå¯å€ã®ç¶æ
å€ã®ããŒã¿ã䜿çšãããšãïŒã«ã¬ã³ããªã³ã°ãé§åããããã®æšå¥šã³ãŒããã¹ãšããŠææžåãããŠããããã§ãã forceUpdate
ã®äœ¿çšæ³ã¯ãç§ã®ããŒã ãReactã§äœ¿çšãã䜿çšãã¿ãŒã³ãšãŸã£ããåãããã«èšèšãããŠããŸãã
ReactããŒã ã¯JSã§ç¶æ ãäžå€ã«ããããšãã§ããŸããããã¯ç°¡åã§ãã ãã ããäžäœäºææ§ã¯ãããŸããã
ç¹°ãè¿ããŸããã次ã®ãšããã§ãã
this.state.state.value = 1
åæ³ãã©ããïŒ
ããã ãšæããŸãããç§ã®æèŠã¯ããã¯ã£ããããŠããŸã...
å¯å€æ§/äžå€æ§ã«ã€ããŠã®äŒè©±ã¯_ãŸã _é¢é£æ§ããããšã¯æããŸããã æããã«ããã®å€æŽãšçµã¿åããããTSã³ã³ãã€ã©ã®ãã°ïŒ Readonly
ã«é¢ããïŒã«ãããæ±çšã³ã³ããŒãã³ããå®å
šã«äœ¿çšã§ããªããªããæ¢åã®ã³ãŒãã®å€ããç ŽæããŸãã 確ãã«ãããã¯åºãåãå
¥ããããŠããæå¹ãªãŠãŒã¹ã±ãŒã¹ã§ãããä»ã®ãšãããããããŒã«ããã¯ããã®ã«ååãªçç±ã§ããïŒ
interface test1 {
num: number;
}
function add<T extends test1>(initial: T, add: number) {
var copy: Readonly<T> = initial;
//ERROR HERE: [ts] Operator '+' cannot be applied to types 'T["num"]' and 'number'.
return copy.num + add;
}
ããã«ã€ããŠTypescriptããŒã ã«æªè§£æ±ºã®åé¡ããããã©ãã誰ããç¥ã£ãŠããŸããïŒ åœŒãã®ãã©ãã«ãŒã§é¢é£ããåé¡ãèŠã€ããããšãã§ããªãããã§ãã
@caesay Microsoft / TypeScriptïŒ15501ãåç §
ã³ã³ã¹ãã©ã¯ã¿ãŒã§ç¶æ ãåæåããå¿ èŠããããŸãããtslintã¯ãç¶æ ã¯èªã¿åãå°çšã§ãããšè¡šç€ºããŸãã
constructor(props) {
super(props);
this.state = {
value: props.defaultValue,
};
}
ã©ãããã°ä¿®æ£ã§ããŸãã..............ã
setStateã䜿çšãã
setStateãã³ã³ã¹ãã©ã¯ã¿ãŒã§æ©èœããªã
ãŸãã¯ãcomponentWillMount w/setStateãæ€èšããŠãã ãã
ããããšã
ããã«ã¡ã¯ã
ã¹ã¬ããå šäœãèªã¿ãŸãããã @ alanwei0ã·ããªãªãåŠçããèšç»ããããã©ããã¯ããããŸãããïŒ
state
ãReadOnly
$ãšããŠäœ¿çšããããšãçã«ããªã£ãŠããããšã«å®å
šã«åæããŸãã componentDidMount
ãå®è¡ãããåã«$ render
ãåŒã³åºããããããã³ã³ã¹ãã©ã¯ã¿ãŒã§åæç¶æ
ãèšå®ã§ããªããšèšããããšãäºæ
ã¯ããªãè€éã«ãªããŸãã
ã³ã³ã¹ãã©ã¯ã¿ãŒthis.state = {
ã䜿çšãã@pawelpabichã¯åé¡ã§ã¯ãããŸããã ã³ã³ã¹ãã©ã¯ã¿ãŒã§readonly
å€æ°ã«å²ãåœãŠãããšãã§ãã Readonly<T>
ã¯å²ãåœãŠã劚ããŸããïŒãããŸã§ã«ïŒïŒã
interface TInterface {
test: string;
}
class TClass {
readonly blah: Readonly<TInterface>;
constructor() {
this.blah = { test: "constructor" };
}
fn = () => {
this.blah = { test: "fn" };
}
}
ããã§ã®å¯äžã®ãšã©ãŒã¯fn
å
ã«ãããŸã- Readonly<T>
ãåå ã§ã¯ãªãã readonly
ããŒã¯ãŒããåå ã§ãã å®éãææ°ããŒãžã§ã³ã®ã¿ã€ãã³ã°ã§ã¯readonly
ããŒã¯ãŒãã䜿çšãããŠããªããããç¶æ
å
ã®ããããã£ãå€æŽããã ãã§ãªããå®éã«ã©ãã«ã§ãç¶æ
ãå²ãåœãŠãããšãã§ããŸãã
ããã§è©±ããŠããåé¡ã¯ãtypescriptã³ã³ãã€ã©ã®ãã°ã§ãããç¶æ¿ãããã³ã³ããŒãã³ãã§ç¶æ ããããã£ã®åã倱ãããŠããŸããã ããã¯ãã®åŸä¿®æ£ããããšæããŸãããããããªãããã®åé¡ã¯è§£æ±ºã§ããŸãã
@caesayç³ãèš³ãããŸããããããã§è©±ããŠããã®ã¯ããã ãšæããŸããã ç§ã®åé¡ã¯ãåºæ¬ã¯ã©ã¹ã§ç¶æ ãèšå®ã§ããªãããšã§ãã ç§ã¯TS2.4.1ã䜿çšããŠããŸãã ããŸããŸåé¡ã®IDãæããŠããã ããŸããïŒ
ïŒcomponentWillMountå ã®ïŒsetStateããã€ã§ãåŒã³åºãããšãã§ããŸãã
@pawelpabichç¹°ãè¿ããŸãããããã¯åé¡ã§ã¯ãããŸãã:)æå³çã«åºæ¬ã¯ã©ã¹ããç¶æ ãå²ãåœãŠãããšã¯ã§ããŸããã ãªããŠããšãããã§ããïŒ æŽŸçã³ã³ããŒãã³ãã§äœ¿çšãããŠããpropã³ã³ãã©ã¯ããããããŸããã
interface BaseCompState {
baseState1?: string;
}
class BaseComp<TState extends BaseCompState> extends React.Component<any, TState> {
constructor(props) {
super(props);
this.state = {
baseState1: "fromBase",
};
}
}
interface TopCompState extends BaseCompState {
topState1?: string;
}
class TopComp extends BaseComp<TopCompState> {
constructor(props) {
super(props);
this.state = {
baseState1: "fromTop",
topState1: "fromTop",
};
}
}
ããã¯æŽŸçã³ã³ããŒãã³ãã®ç°¡åãªäŸã§ãïŒå°éå
·ã¯çç¥ãããŠããŸãããåãèãã§ãïŒã åºæ¬ã¯ã©ã¹ã®this.state =
ã¯ã TState
ãäœã§ããããç¥ããªããããæããã«æ©èœããŸããã ããã«ããããæ©èœããå Žåã¯ã芪ã«ãã£ãŠèšå®ãããç¶æ
ãäžæžãããã ãã§ãã æçµçãªç¶æ
ã¯{ baseState1: "fronBase" }
ã«ãªããŸãã topStateããããã£ã¯ã©ããªããŸãããïŒ
ããŒã¹ã³ã³ããŒãã³ãã§ç¶æ
ãåŠçããå¿
èŠããããšçµ¶å¯Ÿã«ç¢ºä¿¡ããŠããå Žåã¯ã掟çã³ã³ããŒãã³ãããããŒã¹ã³ã³ããŒãã³ãã³ã³ã¹ãã©ã¯ã¿ãŒã«ç¶æ
ãæž¡ãããšãã§ããŸãïŒå²ãåœãŠå¯èœãªããã«TState
ãšããŠïŒ-ããã¯æ¬¡ã®ããã«ãªããŸããããïŒ
interface BaseCompState {
baseState1?: string;
}
class BaseComp<TState extends BaseCompState> extends React.Component<any, TState> {
constructor(props, state: TState) {
super(props);
this.state = Object.assign({
baseState1: "fromTop",
}, state);
}
}
interface TopCompState extends BaseCompState {
topState1?: string;
}
class TopComp extends BaseComp<TopCompState> {
constructor(props) {
super(props, {
topState1: "fromTop",
});
}
}
ãŸãã¯ãããã«ç°¡åã«ãããŒã¹ã³ã³ããŒãã³ãå
ããthis.setState(
ãåŒã³åºãããšãã§ããŸãïŒããã§ããã³ã³ã¹ãã©ã¯ã¿ãŒã§ãããè¡ãããšãã§ããŸãïŒïŒ
ããã§ã¯åé¡ã¯ãããŸããã
@caesayå¶çŽããªãå Žåãå²ãåœãŠã¯æå³ããªããªãããšã«å®å šã«åæããŸãã ãã ããã³ã³ãã€ã©ã«ã¯ã³ãŒããæ£ããããšã確èªããããã«å¿ èŠãªãã¹ãŠã®æ å ±ããããŸããã次ã®ã³ãŒãã§ãã³ã³ãã€ã«ãšã©ãŒãçºçããŸãã
import * as React from "react";
/* tslint:disable:max-classes-per-file*/
interface BaseProps {
baseProp: string;
}
interface BaseState {
baseState: string;
}
class Base<TProps extends BaseProps, TState extends BaseState> extends React.Component<TProps, TState> {
constructor(props) {
super(props);
this.state = {
baseState: props.baseProp
};
}
render() {
return <div>{this.state.baseState}</div>;
}
}
interface DerivedProps extends BaseProps {
derivedProp: string;
}
interface DerivedState extends BaseState {
derivedState: string;
}
export class Derived extends Base<DerivedProps, DerivedState> {
constructor(props) {
super(props);
this.state = {
derivedState: props.derivedProp
};
}
render() {
return <div>{this.state.derivedState}</div>;
}
}
ãšã©ãŒ
webpack: Compiled successfully.
ERROR at Test.tsx(17,9):
TS2322: Type '{ baseState: any; }' is not assignable to type 'Readonly<TState>'.
ERROR at Test.tsx(39,9):
TS2322: Type '{ derivedState: any; }' is not assignable to type 'Readonly<DerivedState>'.
Property 'baseState' is missing in type '{ derivedState: any; }'.
Version: typescript 2.4.1
åãã ã³ã³ã¹ãã©ã¯ã¿ãŒã®ããŒã¹ã«ããå°éå
·ã¯å
¥åãããŠããŸããã ãããã£ãŠã props.baseProp
ã¯any
ã§ãããå²ãåœãŠã§ããŸããã
次ã«ã Derived
ã®å°éå
·ã«ãåãåé¡ãããã baseState
ããããŸããã ãã¡ãããèªã¿åãå°çšã«é¢ä¿ãªããã©ã¡ããæ©èœããŸãã
TProps extends BaseProps
ã¯ã TProps
ã«å°ãªããšãBaseProps
ãšåãã¡ã³ããŒãããããšãæå³ããŸãã ã§ã¯ãããã¯ã©ã®ããã«å®çŸ©ãããŠããªãã®ã§ããããïŒ ã³ã³ãã€ã©ããããæšæž¬ã§ããªããããããªãããšã¯ç解ããŠããŸããããããå®çŸ©ãããŠããªããšèšãã®ã¯æ£ãããªãããã§ãã åãèãæ¹ãDerived
ã«ãé©çšã§ããŸãã
ã³ã³ã¹ãã©ã¯ã¿ãŒã®@caesay setState
ã¯ããã®ã¡ãœãããéåæã§ãããåæç¶æ
ãèšå®ããªããŠãrender
ã«å°éã§ãããããä¿¡é Œã§ãããœãªã¥ãŒã·ã§ã³ã§ã¯ãããŸããã
ç§ãèŠãããšãã§ããå¯äžã®ä¿¡é Œã§ãã解決çã¯ã掟çã¯ã©ã¹ã«ç¶æ å šäœãèšå®ããããšã§ãã ããã«ã¯æãããªæ¬ ç¹ããããŸãã
äžã§ç€ºããäŸã¯CïŒã§æ©èœããã®ã§ãTypeScriptã§æ©èœããããšãã§ããã°äŸ¿å©ã§ãã
componentWillMount
ã§setState
ãåŒã³åºãããšã§ãã ããªãã®åºå°ã¯ãã®åã®ããã«äœãç¶æ
ã«ããã¹ãããç¥ããªãã®ã§ãããããthis.state
ãå®å
šãªæ§æã«ããããšãã§ããŸããã ãã ãããµãã¯ã©ã¹ã¯èŠªã®componentWillMount
ãåŒã³åºããŠãããå¿
èŠãšæãããç¶æ
ãèšå®ã§ããŸããthis.state
ã«å²ãåœãŠãããšããŠããŸããç·šéæžã¿ãã³ã³ã¹ãã©ã¯ã¿ãŒã®setStateã«ã€ããŠééã£ãŠããããšãåæ ããèªã¿ãããããããã«ããã¯ã¯ã©ãŒããè¿œå ããŸããã
@ericandersonããã§ã¯é²å±ããªããšæããŸãã äŸã瀺ããŸããããããã«çŠç¹ãåœãŠãŠããã ããã°å¹žãã§ãã ããã§ãªããã°ãè°è«ããã®ã¯é£ããã§ãã
setState
ã«é¢ããŠã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã§äœ¿çšããã®ã¯å®å
šã§ã¯ãããŸããã ãšã©ãŒã¯ã¹ããŒãããŸããããã¬ã³ããªã³ã°ãè¡ãããåã®ç¶æ
ã¯èšå®ãããŸããã ãã®ããã«å£ããã³ãŒãããããReactã®ããã¥ã¡ã³ãã¯éåžžã«æ確ã§ãããããã§äœ¿çšãã¹ãã§ã¯ãããŸããã
@pawelpabichããããããã¯ãã®è°è«ãããå Žæã§ã¯ãããŸããã ããªãã¯èšèªã®ç解ã«ãããŠæ ¹æ¬çã«ééã£ãŠããŸãã æäŸããäŸã§ã¯ãå·ãžã®å²ãåœãŠã®ãããã«ãããŠããå·ãå¥çŽãæºãããŠããŸããã
ããšãã°ãããªãããããšã
this.state = { baseState: props.baseProp };
// now the state is exactly { baseState: props.baseProp }
ç¶æ
ã¯æ£ç¢ºã«{ baseState: props.baseProp }
ã§ãããããã¯TProps extends BaseProps
ã®èŠä»¶ãæºãããŠããŸããïŒTPropsãäœã§ããããããããªãããã§ãïŒããããã£ãå«ãŸããŠããå¯èœæ§ããããŸãïŒã
ãã®åŸãããªãã¯_SEPARATE_å²ãåœãŠãè¡ã£ãŠããŸãã
this.state = { derivedState: props.derivedProp };
// now the state is exactly { derivedState: props.derivedProp }
ç¶æ
ã¯æ£ç¢ºã«{ derivedState: props.derivedProp }
ãªãïŒåºæ¬ç¶æ
ã®å²ãåœãŠãäžæžãããŸãã!!ïŒãããã¯DerivedStateãŸãã¯BasePropsãæºãããŠããŸããã
ããªãã¯ãããããŸãããã¯ãã ãšèããã®ã«å®å šã«èª€è§£ãããŠããŸãã åºæ¬çãªå€æ°ã®å²ãåœãŠãã©ã®ããã«æ©èœãããã«ã€ããŠåé¡ãããå Žåã¯ãæ°ããåé¡ã§èšèªãã¶ã€ããŒã«åãäžããŠãããã§æå¢ãããã®ã§ãããã§éç¥ãåãåããªãããã«ããŠãã ããã
è£è¶³ãšããŠãããŒã¹ã®render()
ã¡ãœããããªãŒããŒã©ã€ãããŸããããã¯ãããŒã¹ã³ã³ããŒãã³ããäœãã¬ã³ããªã³ã°ã§ããªãããšãæå³ããŸãã ãããå¿
èŠã§ãããšç¢ºä¿¡ããŠããå Žåã¯ãä¿è·ãããã¡ã³ããŒgetBaseState()
ãè¿œå ããç¶æ
ãèšå®ãããšãã«æŽŸçã³ã³ã¹ãã©ã¯ã¿ãŒãããããåŒã³åºãããšãã§ããŸãïŒãããã£ãŠãåºæ¬ç¶æ
ããžãã¯ãè€è£œããå¿
èŠã¯ãããŸããïŒã ããããããªããæ¬åœã«æãã§ããã®ã¯ã掟çã³ã³ããŒãã³ãããŸã£ãã䜿çšããªãããšã§ãã ã³ã³ããžã·ã§ã³ã䜿çšããããã«åæ§ç¯ããŠã¿ãŠãã ããïŒ1ã€ã®ãªããžã§ã¯ãã«è€æ°ã®åãªããžã§ã¯ããå«ãŸããŠããå ŽåïŒã ããªããããã«ãªããšæããŸãã
ç§ã¯ããªããšãããè°è«ããããã ãã«æ°ãããããžã§ã¯ããäœæããããã«èªæžããé¢ããããããŸããããæ®å¿µãªãã...
ã³ã³ã¹ãã©ã¯ã¿ãŒã§setState
ïŒïŒã«ã€ããŠä¿®æ£ããããŸãŸã«ãªããŸããã componentWillMount
ã§ã®äœ¿çšã«ã€ããŠã®æãæ¹ã¯å€ãããŸããã
ãããã©ã®ããã«è¡ããããã®å®äŸïŒ
https://github.com/ericanderson/set-state-example
å ·äœçã«ã¯ãindex.tsxïŒ
import * as React from "react";
import * as ReactDOM from "react-dom";
/* tslint:disable:max-classes-per-file*/
interface BaseProps {
baseProp: string;
}
interface BaseState {
baseState: string;
}
class Base<TProps extends BaseProps, TState extends BaseState> extends React.Component<TProps, TState> {
public componentWillMount() {
this.setState({
baseState: this.props.baseProp,
});
}
public render() {
return (
<p>
<code>this.state.baseState: </code>
{this.state.baseState}
</p>
);
}
}
interface DerivedProps extends BaseProps {
derivedProp: string;
}
interface DerivedState extends BaseState {
derivedState: string;
}
export class Derived extends Base<DerivedProps, DerivedState> {
public componentWillMount() {
super.componentWillMount();
this.setState({
derivedState: this.props.derivedProp,
});
}
public render() {
return (
<div>
<p>
<code>this.state.derivedState: </code>
{this.state.derivedState}
</p>
{super.render()}
</div>
);
}
}
ReactDOM.render(<Derived derivedProp="its derived" baseProp="its basic" />, document.getElementById("main"));
@pawelpabichåæç¶æ
ã§ããªã¢ãŒãã£ãã¯ã³ã³ããŒãã³ããå®è£
ããå Žåã¯ãããŒã¹ã³ã³ããŒãã³ããæœè±¡åãã掟çã¯ã©ã¹ã«å®è£
ããæœè±¡getInitialState()
ïŒãŸãã¯åæ§ã®ããŒãã®ïŒé¢æ°ãäœæããå¿
èŠããããŸãã @ericandersonã瀺ããŠããããã«ãã³ã³ã¹ãã©ã¯ã¿ãŒãŸãã¯setState
ã䜿çšããŠãç¶æ
ã1åã ãå²ãåœãŠãå¿
èŠããããŸãã
以äžã¯ãç¶æ ã®æ§ç¯ã«é¢ããé¢å¿ã®åé¢ãå®å šã«åé¢ãããå®å šã«å€åœ¢ã®ãœãªã¥ãŒã·ã§ã³ã«å€æãããäŸã§ãã
interface BaseProps {
baseProp: string;
}
interface BaseState {
baseState: string;
}
abstract class Base<TProps extends BaseProps, TState extends BaseState> extends React.Component<TProps, TState> {
constructor(props: TProps) {
super(props);
this.state = this.getInitialState();
}
protected abstract getInitialState(): TState;
protected getBaseState() {
return this.props.baseProp;
}
render() {
return <div>{this.state.baseState}</div>;
}
}
interface DerivedProps extends BaseProps {
derivedProp: string;
}
interface DerivedState extends BaseState {
derivedState: string;
}
export class Derived extends Base<DerivedProps, DerivedState> {
getInitialState(): DerivedState {
return {
baseState: this.getBaseState(),
derivedState: this.props.derivedProp,
};
}
render() {
return <div>{this.state.derivedState}</div>;
}
}
@patsissonsããããšãïŒ
@caesayç§ã¯èªåãééã£ãŠããããšãèªããäœããã®çç±ã§å²ãåœãŠãçžäºã«äžæžããããããšãèªèããŠããŸããã§ããã ããã¯èšã£ãŠããCAPSãš!
ã䜿çšããŠããèªåã®ç©Žããæãåºãã®ã«åœ¹ç«ã¡ãŸããã§ããã
@patsissonsãš@ericandersonã¯åé¡ã«çŠç¹ãåãããä»ã®äººã䜿çšã§ãã解決çãã§ããŸããã
@pawelpabichç§ã¯ç§ã®ãããšãªã¹ã ãå°éçã§ã¯ãªãã£ãããšã«åæããŸãããåœç¶ã®ããšãªãããç§ãããªãã«ããã€ãã®èª¬æããµã³ãã«ãªã©ãäžããããšãèãããšãããªãã¯ç§ã«è³ãåŸããªãããšãéžæããŸãã
ãã®å Žåã芪ã«ãã£ãŠèšå®ãããç¶æ ãäžæžãããã ãã§ãã
[_å¿ èŠã«å¿ããŠ_]ããŒã¹ã³ã³ããŒãã³ãã®ç¶æ ãåŠçããå Žåã¯ã掟çã³ã³ããŒãã³ãããããŒã¹ã³ã³ããŒãã³ãã³ã³ã¹ãã©ã¯ã¿ãŒã«ç¶æ ãæž¡ãããšãã§ããŸãã
[_掟çã³ã³ããŒãã³ãã§ç¶æ ãåŠçããå Žå_]ä¿è·ãããã¡ã³ããŒgetBaseStateïŒïŒãè¿œå ããç¶æ ãèšå®ãããšãã«æŽŸçã³ã³ã¹ãã©ã¯ã¿ãŒãããããåŒã³åºãããšãã§ããŸãã
@patsissonsãè¡ã£ãããšã¯ãããã§ãã§ã«è¿°ã¹ãã³ã¡ã³ããååŸããã³ãŒããµã³ãã«ãæäŸããããšã§ãããããã¯å¿ èŠã§ã¯ãªãã£ãã¯ãã§ãã ããã¯ã¹ã¿ãã¯ãªãŒããŒãããŒã§ã¯ãªããæ¢è£œã®ã³ãŒããµã³ãã«ãæäŸããªãããšããããããŸãã
ç§ã¯åå¿ããŠã¿ã€ãã¹ã¯ãªãããäœæããã®ã¯åããŠã§ããããããsthã¯ããããŸããããã¢ããªããšã©ãŒãèŠåããã³ããªãã§ã³ã³ãã€ã«ãããŠããã©ã³ã¿ã€ã ãšã©ãŒãçºçããŸãã 以äžã¯ã³ã³ããŒãã³ãã®äŸã§ãã ãšã©ãŒã¯Readonly
ç¶æ
ã«èµ·å ãããšèããŠããŸãã Readonly
ã®å€æŽåã«ã¢ããªãæ©èœããŠããå Žåããã®å€æŽåŸã¯æ©èœãåæ¢ããã³ã³ãã€ã«æãšã©ãŒã¯çºçããŸããã
import * as React from 'react';
export default class HomePage extends React.Component<any, Map<string, string>> {
public componentWillMount() {
const map = new Map<string, string>();
map.set('aKey', 'aValue');
this.setState(map);
}
public render() {
return (
<div className="home">
<div className="greeting">
Home page: {this.state.get('aKey')} // <-- I get an error here
</div>
</div>
);
}
}
ãšã©ãŒïŒ
homePage.tsx:12 Uncaught TypeError: this.state.get is not a function
at HomePage.render (homePage.tsx:12)
at eval (ReactCompositeComponent.js:793)
at measureLifeCyclePerf (ReactCompositeComponent.js:73)
at ReactCompositeComponentWrapper._renderValidatedComponentWithoutOwnerOrContext (
ç¶æ
ã¯åžžã«ãã¬ãŒã³ããŒãªããžã§ã¯ãafaikã§ããå¿
èŠãããããã代ããã«ç¶æ
ãå®çŸ©ããŸã
次ã®ãããªãã®ãšããŠïŒ { values: Map <string, string> }
ãããŠèªãthis.state.values.get('aKey')
Op vr299æã 2017 om09:01schreefJanuszBiaÅobrzewski<
[email protected]>ïŒ
ç§ã¯åå¿ããŠã¿ã€ãã¹ã¯ãªãããæžãã®ã¯åããŠã§ããããããç§ã¯sthãç¥ããŸãããã
ã¢ããªã¯ãšã©ãŒãèŠåããã³ããªãã§ã³ã³ãã€ã«ãããŸãããã©ã³ã¿ã€ã ãçºçããŸã
ãšã©ãŒã 以äžã¯ã³ã³ããŒãã³ãã®äŸã§ãã ãšã©ãŒã¯èªã¿åãå°çšã«èµ·å ãããšèããŠããŸã
å·ã èªã¿åãå°çšã®å€æŽåã«ã¢ããªãæ©èœããå Žåã¯ããã®åŸ
å€æŽãããšåäœãåæ¢ããã³ã³ãã€ã«æãšã©ãŒã¯çºçããŸãããimport * as React from'react';
ããã©ã«ãã¯ã©ã¹ã®ãšã¯ã¹ããŒãHomePageã¯React.Componentãæ¡åŒµããŸã> { public componentWillMountïŒïŒ{
const map = new MapïŒïŒ;
map.setïŒ'aKey'ã'aValue'ïŒ;
this.setStateïŒmapïŒ;
}public renderïŒïŒ{
return ( <div className="home"> <div className="greeting"> Home page: {this.state.get('aKey')} // <-- I get an error here </div> </div> );
}
}ãšã©ãŒïŒ
ããŒã ããŒãžã tsx ïŒ12 Uncaught TypeErrorïŒthis.state.getã¯é¢æ°ã§ã¯ãããŸãã
HomePage.renderïŒhomePage.tsxïŒ12ïŒã§
evalã§ïŒReactCompositeComponent.jsïŒ793ïŒ
measureLifeCyclePerfïŒReactCompositeComponent.jsïŒ73ïŒã§
ReactCompositeComponentWrapper._renderValidatedComponentWithoutOwnerOrContextïŒâ
ããªããèšåãããã®ã§ãããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/DefinitelyTyped/DefinitelyTyped/issues/14250#issuecomment-333047367 ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/ABvGhM5hDyRNyUeZuIiGeTZk1N-rfuA4ks5snJW5gaJpZM4LuDWV
ã
æè¬ããŸããããã¹ããããã¡ã³ããŒã¯èªã¿åãå°çšã®åœ±é¿ãåããªããããç¶æ
ãReadonly<S>
ãšããŠå®£èšããã®ã¯ç¡æå³ãªäœæ¥ã®ããã§ãã
Readonly
ãååž°çã«é©çšãããå¯èœæ§ããããŸãããä»ã®ãšããããããæ£ããåŠçããããšã確èªããå¿
èŠããããŸãã ããªãã®å Žåãããªãã¯æ¬åœã«ReadonlyMap
ãŸãã¯
interface State {
readonly [key: string]: string;
}
ãŸãã¯ãã¹ãïŒ
interface State {
map: { readonly [key: string]: string };
}
æ·±ãèªã¿åãå°çšã«äœ¿çšã§ããŸãã
export type DeepReadonly<T> =
T extends Array<any> ?
ReadonlyArray<T[0]> :
T extends Date ?
T :
T extends Function ?
T :
T extends object ?
{ readonly [P in keyof T]: DeepReadonly<T[P]> } :
T;
export type Writable<T> =
T extends ReadonlyArray<any> ?
Array<WritableObject<T[0]>> :
T extends Array<any> ?
Array<WritableObject<T[0]>> :
WritableObject<T>;
type WritableObject<T> =
T extends Date ?
T :
T extends Function ?
T :
T extends object ?
{ -readonly [P in keyof T]: Writable<T[P]> } :
T;
æãåèã«ãªãã³ã¡ã³ã
åé¡3ã¯è°è«ã®äœå°ããããšæããŸãã
äžèšã®äŸãReactã§_æè¡çã«_å®è¡ã§ããããšã¯æ£ããã§ãããReactãæå³ãããæ¹æ³ã§ã¯ãªãããšã¯ééããããŸããã
ããã¯ã3ã€ã®ç°ãªãã±ãŒã¹ã«åããããšãã§ããŸãã
äžè¬çãªåæå
å°éå ·ã«åºã¥ãåæå
forceUpdate
ã䜿çšããã©ã³ãã ãªå²ãåœãŠäººã ããæ£ããããã®ã«åããããæ¹ãè¯ããšæãã®ã§ã
public state
ãå宣èšããããšã§ããã®åé¡ãç°¡åã«åé¿ã§ããŸãã