#javascript #react-native #android-studio
#javascript #react-native #android-studio
Вопрос:
У меня есть компонент класса, и мне нужно передать одну из его функций в ящик и использовать ее, но я не знаю, возможно ли это:
class Edit_note extends Component {
save_changes = async() => {
let clear_content = this.state.content.replace(/amp;nbsp;/g,""); //replace al amp;nbsp;
try {
const data = JSON.parse(await AsyncStorage.getItem("data"));
const index_to_find = this.array_notes.findIndex(obj => obj.note_number === this.note[0].note_number);
const edited_note = this.note.map((note) => {
note.content = clear_content;
return {...note}
});
this.array_notes.splice(index_to_find, 1, edited_note[0]);
data.array_notes = this.array_notes;
await AsyncStorage.setItem("data", JSON.stringify(data));
} catch(error) {
alert(error);
}
}
render() {
return (
<>
<Text>hi</Text>
</>
);
}
}
export default Edit_note;
это мой компонент класса, и я хочу экспортировать функцию save_changes и использовать ее в заголовке заметки редактирования, поместите ее в значок
import React, { Component } from "react";
import { Text, View } from "react-native";
import { Feather } from '@expo/vector-icons';
class Header extends Component {
render() {
return (
<>
<View style ={{backgroundColor: "white", flexDirection: "row", alignItems: "center"}}>
<View>
<Text style = {{color: "black", fontSize: 30, marginLeft: -20}}>{this.props.title}</Text>
</View>
<Feather name="check-square" size={24} color = "black" />
</View>
</>
);
}
}
export default Header;
Как я могу это сделать?
Ответ №1:
Вы не можете этого сделать. Единственный способ — извлечь save_changes
из класса как утилиту, экспортировать ее и использовать там, где когда-либо потребуется передача правильных параметров.
В файле, в котором у вас есть компонент класса, внесите следующие изменения:
export const save_changes = async(<Pass the parameter here>) => {
let clear_content = this.state.content.replace(/amp;nbsp;/g,""); //replace al amp;nbsp;
try {
const data = JSON.parse(await AsyncStorage.getItem("data"));
const index_to_find = this.array_notes.findIndex(obj => obj.note_number === this.note[0].note_number);
const edited_note = this.note.map((note) => {
note.content = clear_content;
return {...note}
});
this.array_notes.splice(index_to_find, 1, edited_note[0]);
data.array_notes = this.array_notes;
await AsyncStorage.setItem("data", JSON.stringify(data));
}catch(error) {
alert(error);
}
}
class Edit_note extends Component {
render() {
return (
<>
<Text>hi</Text>
</>
);
}
}
export default Edit_note;
Теперь вы можете импортировать save_changes
функцию из любого места из этого файла
Комментарии:
1. и как я это делаю?
2. ммм, таким образом, я не могу использовать переменные внутри класса, верно?
3. Для этого вам нужно вернуть данные из вашей функции и установить их внутри компонента класса. это просто то, как вы пишете код.
Ответ №2:
Чтобы экспортировать функцию из вашего компонента, вам нужно, чтобы она была public static
, и удалить все использование this
внутри функции. public
Слово означает, что к функции можно получить доступ извне компонента, с Edit_note.save_changes()
помощью . Ключевое static
слово используется, чтобы сделать функцию независимой от экземпляра компонента.
Чтобы импортировать необходимые данные из вашего экземпляра, вы можете передать их в качестве параметров в своей функции save_changes
.
В результате у вас должно получиться что-то вроде этого:
public static async save_changes (content, array_notes, note) {
let clear_content = content.replace(/amp;nbsp;/g,""); //replace al amp;nbsp;
try {
const data = JSON.parse(await AsyncStorage.getItem("data"));
const index_to_find = array_notes.findIndex(obj => obj.note_number === note[0].note_number);
const edited_note = note.map((note) => {
note.content = clear_content;
return {...note}
});
array_notes.splice(index_to_find, 1, edited_note[0]);
data.array_notes = array_notes;
await AsyncStorage.setItem("data", JSON.stringify(data));
} catch(error) {
alert(error);
}
}
И затем вы можете вызвать эту функцию в любом другом компоненте с Edit_note.save_changes()
помощью, если компонент Edit-note
также импортируется в верхние строки компонента.
Комментарии:
1. Было бы лучшим подходом, если бы класс не был компонентом React. В противном случае почему бы не создать простой класс, создать его экземпляр там, где это необходимо, и вызвать функцию?