React native 导出默认类App扩展React.Component中的挂钩
我正在尝试构建一个React原生应用程序,并重新使用其中的一些原则,但我正在努力解决这个问题:React native 导出默认类App扩展React.Component中的挂钩,react-native,react-hooks,React Native,React Hooks,我正在尝试构建一个React原生应用程序,并重新使用其中的一些原则,但我正在努力解决这个问题: const { scrollEnabled, setScrollEnabled } = useState(false); 放置在: export default class App extends React.Component { 我最初把它放在export default()=>{中,但由于其他原因,我不得不更改它 根据放置位置的不同,我会得到意外标记或无效的钩子调用。钩子只能在函数组件主
const { scrollEnabled, setScrollEnabled } = useState(false);
放置在:
export default class App extends React.Component {
我最初把它放在export default()=>{
中,但由于其他原因,我不得不更改它
根据放置位置的不同,我会得到意外标记
或无效的钩子调用。钩子只能在函数组件主体内部调用。发生这种情况的原因可能是:1.React和呈现程序的版本不匹配(例如React DOM)2.您可能违反了钩子的规则3.同一个应用程序中可能有多个React副本。有关如何调试和修复此问题的提示,请参阅。
我试过移动它并进行重构,但没有成功。你能找出哪里出了问题或者应该放在哪里吗
我将尝试在下面给出我的代码的框架:
import React, { useState, useContext } from "react";
import { View, StyleSheet, StatusBar, Dimensions, Text, ScrollView, TouchableOpacity} from "react-native";
const screen = Dimensions.get("window");
const formatNumber = (number) => `0${number}`.slice(-2);
const getElapsed = (time) => {
return {
hours: formatNumber(hours)
};
};
const { scrollEnabled, setScrollEnabled } = useState(false); // Issue with this line. Tried to move it in different places
export default class App extends React.Component {
interval = null;
constructor(props) {
super(props);
this.state = {
elapsedMilliseconds: 0
};
}
stop = () => {
clearInterval(this.interval);
this.interval = null;
this.setState({
isRunning: false,
});
};
render() {
const { hours, minutes, seconds, milliseconds } = getElapsed(
this.state.elapsedMilliseconds
);
return (
<View style={styles.container}>
<ScrollView>
<View style={styles.content}>
// Stuff
</View>
</ScrollView>
</View>
);
}
}
import React,{useState,useContext}来自“React”;
从“react native”导入{View,StyleSheet,StatusBar,Dimensions,Text,ScrollView,TouchableOpacity};
const screen=Dimensions.get(“窗口”);
常量formatNumber=(number)=>`0${number}`.slice(-2);
const getappeased=(时间)=>{
返回{
小时数:小时数
};
};
const{scrollEnabled,setScrollEnabled}=useState(false);//此行有问题。试图将其移到其他位置
导出默认类App扩展React.Component{
间隔=空;
建造师(道具){
超级(道具);
此.state={
elapsedMilliseconds:0
};
}
停止=()=>{
clearInterval(这个.interval);
this.interval=null;
这是我的国家({
isRunning:false,
});
};
render(){
常量{小时、分钟、秒、毫秒}=GetExpressed(
this.state.elapsedmillistes
);
返回(
//东西
);
}
}
不能在类组件内使用React钩子
import React, { useState, useContext } from "react";
import { View, StyleSheet, StatusBar, Dimensions, Text, ScrollView, TouchableOpacity} from "react-native";
const screen = Dimensions.get("window");
const formatNumber = (number) => `0${number}`.slice(-2);
const getElapsed = (time) => {
return {
hours: formatNumber(hours)
};
};
export default class App extends React.Component {
interval = null;
constructor(props) {
super(props);
this.state = {
elapsedMilliseconds: 0
scrollEnabled: false // add scroll enable to state
};
}
stop = () => {
clearInterval(this.interval);
this.interval = null;
this.setState({
isRunning: false,
scrollEnabled: true, // example of setting scrollEnabled to true
});
};
render() {
const { hours, minutes, seconds, milliseconds } = getElapsed(
this.state.elapsedMilliseconds
);
return (
<View style={styles.container}>
<ScrollView>
<View style={styles.content}>
// Stuff
</View>
</ScrollView>
</View>
);
}
}
您应该使用<代码> SETSTATE < /COD>,或者考虑将组件转换为“功能”组件。
import React, { useState, useContext } from "react";
import { View, StyleSheet, StatusBar, Dimensions, Text, ScrollView, TouchableOpacity} from "react-native";
const screen = Dimensions.get("window");
const formatNumber = (number) => `0${number}`.slice(-2);
const getElapsed = (time) => {
return {
hours: formatNumber(hours)
};
};
export default class App extends React.Component {
interval = null;
constructor(props) {
super(props);
this.state = {
elapsedMilliseconds: 0
scrollEnabled: false // add scroll enable to state
};
}
stop = () => {
clearInterval(this.interval);
this.interval = null;
this.setState({
isRunning: false,
scrollEnabled: true, // example of setting scrollEnabled to true
});
};
render() {
const { hours, minutes, seconds, milliseconds } = getElapsed(
this.state.elapsedMilliseconds
);
return (
<View style={styles.container}>
<ScrollView>
<View style={styles.content}>
// Stuff
</View>
</ScrollView>
</View>
);
}
}
import React,{useState,useContext}来自“React”;
从“react native”导入{View,StyleSheet,StatusBar,Dimensions,Text,ScrollView,TouchableOpacity};
const screen=Dimensions.get(“窗口”);
常量formatNumber=(number)=>`0${number}`.slice(-2);
const getappeased=(时间)=>{
返回{
小时数:小时数
};
};
导出默认类App扩展React.Component{
间隔=空;
建造师(道具){
超级(道具);
此.state={
elapsedMilliseconds:0
scrollEnabled:false//将滚动启用添加到状态
};
}
停止=()=>{
clearInterval(这个.interval);
this.interval=null;
这是我的国家({
isRunning:false,
scrollEnabled:true,//将scrollEnabled设置为true的示例
});
};
render(){
常量{小时、分钟、秒、毫秒}=GetExpressed(
this.state.elapsedmillistes
);
返回(
//东西
);
}
}
不能在类组件内使用React钩子
import React, { useState, useContext } from "react";
import { View, StyleSheet, StatusBar, Dimensions, Text, ScrollView, TouchableOpacity} from "react-native";
const screen = Dimensions.get("window");
const formatNumber = (number) => `0${number}`.slice(-2);
const getElapsed = (time) => {
return {
hours: formatNumber(hours)
};
};
export default class App extends React.Component {
interval = null;
constructor(props) {
super(props);
this.state = {
elapsedMilliseconds: 0
scrollEnabled: false // add scroll enable to state
};
}
stop = () => {
clearInterval(this.interval);
this.interval = null;
this.setState({
isRunning: false,
scrollEnabled: true, // example of setting scrollEnabled to true
});
};
render() {
const { hours, minutes, seconds, milliseconds } = getElapsed(
this.state.elapsedMilliseconds
);
return (
<View style={styles.container}>
<ScrollView>
<View style={styles.content}>
// Stuff
</View>
</ScrollView>
</View>
);
}
}
您应该使用<代码> SETSTATE < /COD>,或者考虑将组件转换为“功能”组件。
import React, { useState, useContext } from "react";
import { View, StyleSheet, StatusBar, Dimensions, Text, ScrollView, TouchableOpacity} from "react-native";
const screen = Dimensions.get("window");
const formatNumber = (number) => `0${number}`.slice(-2);
const getElapsed = (time) => {
return {
hours: formatNumber(hours)
};
};
export default class App extends React.Component {
interval = null;
constructor(props) {
super(props);
this.state = {
elapsedMilliseconds: 0
scrollEnabled: false // add scroll enable to state
};
}
stop = () => {
clearInterval(this.interval);
this.interval = null;
this.setState({
isRunning: false,
scrollEnabled: true, // example of setting scrollEnabled to true
});
};
render() {
const { hours, minutes, seconds, milliseconds } = getElapsed(
this.state.elapsedMilliseconds
);
return (
<View style={styles.container}>
<ScrollView>
<View style={styles.content}>
// Stuff
</View>
</ScrollView>
</View>
);
}
}
import React,{useState,useContext}来自“React”;
从“react native”导入{View,StyleSheet,StatusBar,Dimensions,Text,ScrollView,TouchableOpacity};
const screen=Dimensions.get(“窗口”);
常量formatNumber=(number)=>`0${number}`.slice(-2);
const getappeased=(时间)=>{
返回{
小时数:小时数
};
};
导出默认类App扩展React.Component{
间隔=空;
建造师(道具){
超级(道具);
此.state={
elapsedMilliseconds:0
scrollEnabled:false//将滚动启用添加到状态
};
}
停止=()=>{
clearInterval(这个.interval);
this.interval=null;
这是我的国家({
isRunning:false,
scrollEnabled:true,//将scrollEnabled设置为true的示例
});
};
render(){
常量{小时、分钟、秒、毫秒}=GetExpressed(
this.state.elapsedmillistes
);
返回(
//东西
);
}
}
首先,只能在功能组件内部使用hook,不能在类内组件或外部组件中使用
import React, { useState, useContext } from "react";
import { View, StyleSheet, StatusBar, Dimensions, Text, ScrollView, TouchableOpacity} from "react-native";
const screen = Dimensions.get("window");
const formatNumber = (number) => `0${number}`.slice(-2);
const getElapsed = (time) => {
return {
hours: formatNumber(hours)
};
};
export default class App extends React.Component {
interval = null;
constructor(props) {
super(props);
this.state = {
elapsedMilliseconds: 0
scrollEnabled: false // add scroll enable to state
};
}
stop = () => {
clearInterval(this.interval);
this.interval = null;
this.setState({
isRunning: false,
scrollEnabled: true, // example of setting scrollEnabled to true
});
};
render() {
const { hours, minutes, seconds, milliseconds } = getElapsed(
this.state.elapsedMilliseconds
);
return (
<View style={styles.container}>
<ScrollView>
<View style={styles.content}>
// Stuff
</View>
</ScrollView>
</View>
);
}
}
如果您使用的是类组件,只需使用state
和setState
而不是hook
比如:
导出默认类App扩展React.Component{
建造师(道具){
此.state={
scrollEnabled:true
}
}
停止=()=>{
this.setState({scrollEnabled:false})
}
render(){
返回(
//东西
)
}
}
首先,只能在功能组件内部使用hook,不能在类内组件或外部组件中使用
import React, { useState, useContext } from "react";
import { View, StyleSheet, StatusBar, Dimensions, Text, ScrollView, TouchableOpacity} from "react-native";
const screen = Dimensions.get("window");
const formatNumber = (number) => `0${number}`.slice(-2);
const getElapsed = (time) => {
return {
hours: formatNumber(hours)
};
};
export default class App extends React.Component {
interval = null;
constructor(props) {
super(props);
this.state = {
elapsedMilliseconds: 0
scrollEnabled: false // add scroll enable to state
};
}
stop = () => {
clearInterval(this.interval);
this.interval = null;
this.setState({
isRunning: false,
scrollEnabled: true, // example of setting scrollEnabled to true
});
};
render() {
const { hours, minutes, seconds, milliseconds } = getElapsed(
this.state.elapsedMilliseconds
);
return (
<View style={styles.container}>
<ScrollView>
<View style={styles.content}>
// Stuff
</View>
</ScrollView>
</View>
);
}
}
如果您使用的是类组件,只需使用state
和setState
而不是hook
比如:
导出默认类App扩展React.Component{
建造师(道具){
此.state={
scrollEnabled:true
}
}
停止=()=>{
this.setState({scrollEnabled:false})
}
render(){
返回(
//东西
)
}
}