我在React中使用Typescript。我在理解如何使用refs方面遇到麻烦,以便相对于refs引用的react节点获得静态类型和智能感知。我的代码如下。
import * as React from 'react';
interface AppState {
count: number;
}
interface AppProps {
steps: number;
}
interface AppRefs {
stepInput: HTMLInputElement;
}
export default class TestApp extends React.Component<AppProps, AppState> {
constructor(props: AppProps) {
super(props);
this.state = {
count: 0
};
}
incrementCounter() {
this.setState({count: this.state.count + 1});
}
render() {
return (
<div>
<h1>Hello World</h1>
<input type="text" ref="stepInput" />
<button onClick={() => this.incrementCounter()}>Increment</button>
Count : {this.state.count}
</div>
);
}}
如果您使用的是React 16.3+,建议的创建引用的方法是使用React.createRef()
。
class TestApp extends React.Component<AppProps, AppState> {
private stepInput: React.RefObject<HTMLInputElement>;
constructor(props) {
super(props);
this.stepInput = React.createRef();
}
render() {
return <input type="text" ref={this.stepInput} />;
}
}
组件安装后,ref
属性的current
属性将分配给引用的组件/
DOM元素,并null
在卸载时分配回该属性。因此,例如,您可以使用进行访问this.stepInput.current
。
有关更多信息RefObject
,请参见@apieceofbart的答案或添加了PR
createRef()
。
如果您使用的是较早版本的React(<16.3),或者需要对引用的设置和取消设置进行更精细的控制,则可以使用“回调引用”。
class TestApp extends React.Component<AppProps, AppState> {
private stepInput: HTMLInputElement;
constructor(props) {
super(props);
this.stepInput = null;
this.setStepInputRef = element => {
this.stepInput = element;
};
}
render() {
return <input type="text" ref={this.setStepInputRef} />
}
}
当组件挂载时,React将ref
使用DOM元素调用回调,并null
在卸载时使用DOM元素调用回调。因此,例如,您可以使用轻松访问它this.stepInput
。
通过将ref
回调定义为类的绑定方法,而不是内联函数),可以避免在更新过程中两次调用该回调。
有曾经是一个API,其中ref
属性是一个字符串(见AKSHAR特尔的答案,但由于一些
问题,串裁判的强烈反对,并最终将被删除。
编辑于2018年5月22日,以在React 16.3中添加执行引用的新方法。 感谢@apieceofbart指出有一种新方法。
问题内容: 使用Typescript在Visual Studio中输入“ .ts”文件,请考虑以下声明: 这很好,类型检查很好,一切都很好。 现在,将完全相同的代码放入用于JSX和React的“ .tsx”文件中。 Intellisense感到非常沮丧和抱怨,因为它试图使 成为React JSX元素。但我的意图是让编译器将其视为通用类型指示符。 编译器抱怨: [gulp-typescript] 1
问题内容: 结合使用TypeScript和React,我们不再需要扩展,以使编译器知道所有react组件prop都可以有子代: 但是,无状态功能组件似乎并非如此: 发出编译错误: 错误:(102、17)TS2339:类型“ MyProps”上不存在属性“子级”。 我猜这是因为编译器实际上没有办法知道在props参数中将提供香草函数。 所以问题是我们应该如何在TypeScript的无状态功能组件中使
使用带有React的TypeScript,我们不再需要扩展,以便编译器知道所有React组件Props都可以有子级: 然而,无状态功能组件似乎不是这样: 发出编译错误: 错误:(102,17)TS2339:类型“MyProps”上不存在属性“children”。 我想这是因为编译器真的无法知道在props参数中会给出
我正在尝试在使用打字稿的 react 本机项目中添加 Amplify 身份验证。amplify 文档中给出了一个包“aws-amplify-react-native”,它用作中间件来验证我们的应用程序。但是这个包只在基于javascript的项目中受支持。对于打字稿,它显示一个错误,例如 没有可用的软件包,如“@类型/aws-放大-反应-原生” 有人能帮我摆脱这一切吗?
我已经通过了在反应v16.7.0中引入的钩子。 https://reactjs.org/docs/hooks-intro.html 所以我对钩子的理解是,我们可以在函数组件中使用状态,而不用在反应中编写类组件。这真是惊人的功能。 但是我没有清楚地了解在功能组件中使用钩子的情况。 如果使用钩子,如何在上述功能组件中使用生命周期方法?
在一个个人项目中,我遇到了一个TypeScript条件类型的问题。我对TypeScript文档中的条件类型有基本的了解。我希望下面的设置工作,但它给出了一个类型错误。 基本上,我试图为从磁盘加载的树节点定义一个接口。这意味着,由于缺少文件等原因,某些节点可能无法正确加载。因此,任何节点实现都可能包含或。 我希望方法的实现可以返回,因为接口是通过类型扩展