簡體   English   中英

使用鈎子動態添加組件

[英]Dynamically add component in react with hooks

我有 3 個組件:Form(父)、Picklist 和 ParagraphBox(子); 基於選擇列表的選擇,我渲染了 ParagraphBox 和一個“+”按鈕。 我想要實現的是單擊加號按鈕,在第一個下方呈現另一個 ParagraphBox。 我也想要刪除功能。

我的 ParagraphBox 組件有一個標題和一個內容,我想給添加一個漸進的數字:例如第 1 段內容:....第 2 段內容:....等等這是我的 ParagraphBox 組件:

import React, { useState, useEffect } from 'react';


export default function ParagraphBox(props) {

const [paragrafo, setParagrafo] = useState({})

useEffect(() => {
    console.log('paragrafo ', paragrafo)
    props.onChange(paragrafo)
}, [paragrafo])

const onChange = (e) => {
    const titolo = e.target.name
    const contenuto = e.target.value
    setParagrafo({
        ...paragrafo,
        [titolo]: contenuto
    })
}

return (
    <div className = "paragraph-box">
        <label>
            {props.labelInputBox}
            <div>
                <input type="text" name="titolo" value={paragrafo.titolo || ''} onChange={onChange}/>
            </div>
            {props.labelTextArea}
            <div>
                <textarea id="subject" name="contenuto" placeholder="Inserisci contenuto.." style={{height: "45x", width: "400px"}} value={paragrafo.contenuto || ''} onChange={onChange} />
            </div>
        </label>
    </div>
 )
}

這是我的表單組件:

import React, { useState, useEffect, useRef } from 'react';
import './Form.css'
import createDocument from '../pdfTool';
import finalita from '../icons/finalita.PNG';
import Picklist from './Picklist.js';
import ParagraphBox from './ParagraphBox';




export default function Form() {
 
const [flagImg, setFlagImg] = useState(false)
const [flagPar, setFlagPar] = useState(false)
const [paragArray, setParagArray] = useState([
    {titolo: '', contenuto: ''}
])

const handleChange = (e) => {
    
    console.log('e ', e)
    console.log('e.titolo PARENT ', e.titolo)
    console.log('e.contenuto PARENT ', e.contenuto)
    setParagArray({
        ...paragArray,
        [e.titolo]: e.contenuto
    })
}


useEffect(() => {
    console.log('rendering useEffect')
    console.log('flagPar: ', flagPar)
    console.log('flagImg: ', flagImg)
    console.log('paragArray ', paragArray)
}, [flagPar, flagImg, paragArray])

const handleSubmit = (evt) => {
    evt.preventDefault(); //usato per evitrare il refresh del browser
}

const addParag = (parag) => {
    console.log('paragArray PARENT  ', paragArray)
    
    
}

const onSelect = (selectedValue) => {
    console.log('valore selezionato nella picklist: ' + selectedValue)
    if(selectedValue === 'Layout 2') {
        setFlagImg(true)
        setFlagPar(true)
    }
}

return(
    <div>
    <Picklist onSelect={onSelect} label="Seleziona un layout di contratto: "  pickVals={["Seleziona...", "Layout 1", "Layout 2", "Layout 3"]}/>
    {flagImg ? (
        <form onSubmit={handleSubmit}>
            <Picklist onSelect={onSelect} label="Seleziona Immagine: " pickVals={["Seleziona...", "Immagine 1", "Immagine 2", "Immagine 3"]} />
        </form>
    ) : null}
    {flagPar ? (
        <div>
            <ParagraphBox labelInputBox="Paragfrafo 1" labelTextArea="Contenuto Paragrafo" onChange={handleChange}/>
            <div id = "add-paragraph">
                <button type="button" onClick={addParag}>+</button>
                <input type="submit" value="Submit" />
            </div>
        </div>            
    ) : null}        
    </div>
)

在此先感謝您的時間

我知道這很老了……但我剛剛遇到了同樣的問題,所以就這樣吧:JSX 只是常規 JavaScript 的語法糖。 因此,您可以手動創建組件並將其作為鈎子的一部分提供,即:

自定義鈎子:

 import React, { useState } from 'react'; import Advise from '../../components/Advise/Advise'; const useAdvise = () => { const [ showAdvise, setShowAdvise ] = useState(false) const [ adviseMsg, setAdviseMsg ] = useState('') const [ loading, setLoading ] = useState(false) const hideAdvise = () => { setShowAdvise(false) } const adviseComponent = React.createElement(Advise, {show:showAdvise, showSpinner:loading, hideAdvise:hideAdvise, children:adviseMsg}) return { adviseComponent, setShowAdvise, setAdviseMsg, setLoading } }; export default useAdvise;

我想要的組件:

 import useAdvise from '../hooks/useAdvise/useAdvise' const Page = () => { const {adviseComponent, setShowAdvise, setAdviseMsg, setLoading} = useAdvise() return( <div> {adviseComponent} </div> ) }

希望它有所幫助(也來自 Br 的歡呼聲)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM