Я не знаю, почему рендеринг не работает в react

#javascript #reactjs #react-native #components #render

#javascript #reactjs #react-native #Компоненты #рендеринг

Вопрос:

Этот код является приложением TODO, которое может добавлять и удалять заметки. Однако, когда я запускаю этот код, срабатывает функция «Добавить» , но когда я пытаюсь удалить заметку, она удаляет заметку не сразу. И когда я пишу любое слово в TextInput, оно удаляет заметку, которую я пытался удалить.

 export function Note(props){ 
    return (
    <View>
    <View>
        <Text>{props.val.date}</Text>
        <Text>{props.val.note}</Text> 
    </View>
    <TouchableOpacity onPress={props.deleteMethod}>
        <Text>D</Text>
    </TouchableOpacity>
    
    </View>
    );   
}

export function MyqtwriteScreen({ navigation, route }) {

const [noteArray, setNoteArray] = useState([]);
const [noteText, setNoteText] = useState('');


let notes = noteArray.map((val, key) => {
    console.log('start');
    return <Note key={key} keyval={key} val={val}
        deleteMethod={() => deleteNote(key)} />
});
const addNote = ()=>{
    if (noteText) {
        var d = new Date();
        noteArray.push({
            'date': d.getFullYear()  
                "/"   (d.getMonth()   1)  
                "/"   d.getDate()   " "   d.getHours()   ":"   d.getMinutes(),
            'note': noteText,
        });
        setNoteArray(noteArray);
        setNoteText('');
    }
};
const deleteNote = (key)=> {
    noteArray.splice(key, 1);
    setNoteArray(noteArray);
    // setNoteText('');
    
};
return (
    <View style={styles.container}>
        <View>
            {notes}
        </View>
        <TextInput
            onChangeText={(noteText) => setNoteText(noteText)}
            value={noteText}
            placeholder='>>>note'
            placeholderTextColor='gray'
        ></TextInput>
        <TouchableOpacity onPress={addNote}>
            <Text> </Text>
        </TouchableOpacity>
    </View>
);  
}
  

Я не знаю, почему рендеринг не работает!
Я борюсь с этой проблемой более 2 дней…
Пожалуйста, помогите мне…..

Ответ №1:

Splice обновляет фактический массив, для компонента для повторного отображения массив должен быть заменен новым экземпляром.

 const deleteNote = (key)=> {
    const newArray=[...noteArray];
    newArray.splice(key, 1);
    setNoteArray(newArray);    
};
  

Этим он будет указан на новый массив.

Причина, по которой он обновляется при изменении текста, заключается в том, что текст вызывает повторный рендеринг при обновлении состояния. Вы также можете рассмотреть возможность использования функции фильтрации массива.

Комментарии:

1. Не работает ли повторный рендеринг, если я обновляю фактический массив? Я не думал, что это создаст проблему. Спасибо за ваш ответ.

2. нет, это всегда должен быть новый экземпляр, подумайте об этом так, вы указываете на ссылку и изменяете что-то внутри этой ссылки, что react не увидит как обновление, поэтому вы должны предоставить новую ссылку 🙂