useState 在功能上與組件 React 的行為不同 (useState behaves differently in function vs componenet React)


問題描述

useState 在功能上與組件 React 的行為不同 (useState behaves differently in function vs componenet React)

import React, {useState} from 'react'
import './box.css'
import cross from './cross.png';
import axios from 'axios'

function Box(props){
const[disappear, setdisappear] = useState(false)
const[appear, setappear] = useState(false)
const[text, settext] = useState('')
const[able, setable] = useState(true)

async function clear(){
    console.log(props.id)
    setdisappear(true)
    let id = props.id
    let token = sessionStorage.getItem('token')
    let data =  {token:token, id:id}
    await axios.post('http://localhost:5000/home/deleteText', data)



}
function theText(e){
    let current = e.target.value
    console.log(current)
    settext(current)
    console.log(text)
    if(current===''){
        setable(true)
    }else{
        setable(false)
    }

}
async function savetext(){
    let data = {text:text, token:sessionStorage.getItem('token')}
    const request = await axios.post('http://localhost:5000/home/addText',data)
    //e.target.reset() 
    document.getElementById('textarea').value = ''

    setable(true)
    setappear(true)

}
function boxx(){
    return(
        <div className = 'wrapper'>
            <div className='outerbox'>
                <div className='empty'>
                </div>
                    <textarea id = 'textarea' onChange ={theText}  className='input' rows="10" cols="50" placeholder='enter ur text mf' defaultValue={props.text}></textarea>
                <div className='x'>
                    <button onClick={clear} value={props.id} disabled = {props.disableButton}>
                        {props.disableButton?'':<img src={cross} alt = '' />}
                    </button>
                </div>
                {props.disableButton?<div><button disabled = {able} onClick = {savetext}>save</button></div>:''}
            </div>
        </div>
    )
}
return(
    <div>

        {disappear?null:boxx()}
        {appear?boxx():null}
    </div>
)

}

export default Box
</code></pre>

所以,正如你在組件Box的return語句中看到的,我調用boxx函數返回box的html。在這種情況下,如果我在文本區域中輸入一些文本,文本會按預期打印,但是如果我將 boxx 函數更改為 Boxx 並在返回語句中我將其用作 </代碼>,我在 textarea 中輸入的文本會立即被刪除,或者只打印一個字母,在我輸入第二個字母后,它們都會被刪除。我發現,這種奇怪的行為是由於 theText 函數中的 useState 引起的,但不知道為什麼會發生這種情況。我該如何解決這個問題?


參考解法

方法 1:

Because Boxx is defined inside of Box, its component type changes every time Box re‑renders, which causes React's diffing algorithm to reset the state of the <textarea> inside it.

(by bearthumPatrick Roberts)

參考文件

  1. useState behaves differently in function vs componenet React (CC BY‑SA 2.5/3.0/4.0)

#use-state #web-component #javascript #reactjs






相關問題

為什麼在使用 useState 時初始加載狀態設置為 true? (Why the initial loading state is set to true while using useState?)

如何在 React 中提取狀態的值 (How to extract value of a state in React)

如何在使用狀態掛鉤更新狀態時覆蓋具有相同鍵的對象 (How can overwrite objects that have the same key in updating State with state hooks)

如何使用 useState 將許多元素添加到數組中? (How to add many elements to an array with useState?)

如何正確附加到在功能組件中作為道具傳遞的字符串數組 (How to properly append to string array that was passed as props in functional component)

useState 在功能上與組件 React 的行為不同 (useState behaves differently in function vs componenet React)

如何在反應鉤子中設置多個值來狀態 (How to set multiple values to state in react hooks)

在 reactJS 中使用 useState 和外部過濾器 (using useState and External Filters in reactJS)

React.js 更改下拉值 (React.js to change dropdown value)

useState 不會立即更新狀態 (useState is not updating state immediately)

使用 useState 時,Reactjs 不會立即更新分配的值 (Reactjs doesn't immediately update the assigned value when useState is used)

如何為 useState 創建動態函數名稱? (How do I create a dynamic function name for useState?)







留言討論