反応-配列アイテムを状態から削除するにはどうすればよいですか?

ROM

私のreactアプリでは、製品の小、中、大のバリエーションを追加できるように、[バリエーションの追加]というボタンで[製品の追加]という名前のページを作成しましたが、小、中、大のバリエーションオブジェクトをから削除する方法がわかりません。ユーザーが気が変わった場合の状態。

問題の概要は次のとおりです。 ここに画像の説明を入力してください

コンポーネントは次のようになります。

const AddProduct = () => {
    const [addVar, setAddVar] = useState(0)
    const [values, setValues] = useState({
        name: "",
        description: "",
        categories: [],
        category: "",
        photo: "",
        loading: false,
        error: "",
        createdProduct: "",
        redirectToProfile: false,
        variations: [],
        formData: ""
    });

    const {
        name,
        description,
        price,
        categories,
        category,
        photo,
        loading,
        error,
        createdProduct,
        redirectToProfile,
        variations,
        formData
    } = values;

    const addVariation = (e) => {
        e.preventDefault()
        setAddVar(addVar + 1)
        let oldV = Array.from(variations); // gets current variations
        let n = oldV.length; // get current array position
        console.log(`Current number of variations is: ${n}`);
        let vPost = [{ 
            number: n,
            vname: "",
            vprice: "",
            vquantity: "",
            vshipping: ""
        }]  
        let newV = oldV.concat(vPost);         
        setValues({
            ...values,
            variations: newV,
            error: ""
        })
    }   

    const handleVariationChange = (name, numberVal) => event => {
        // numberVal is the iteration number
        // name is the variation property which can be vname, vprice, vshipping, vquantity
        // these are tested next in the following if statements
        const value = event.target.value;
        console.log(`numberVal: `, numberVal);
        event.preventDefault()
        let newVariations = Array.from(variations)
                
        if(name === "vname") { 
            newVariations[numberVal].vname = value;
            console.log(`newVariations[numberVal].vname value: `, newVariations)
        }

        if(name === "vprice") { 
            newVariations[numberVal].vprice = value;
            console.log(`newVariations[numberVal].vprice value: `, newVariations)
        }

        if(name === "vshipping") { 
            newVariations[numberVal].vshipping = value;
            console.log(`newVariations[numberVal].vshipping value: `, newVariations)
        }

        if(name === "vquantity") { 
            newVariations[numberVal].vquantity = value;
            console.log(`newVariations[numberVal].vquantity value: `, newVariations)            
        }
        
        setValues({...values, variations: newVariations})
        formData.set("variations", JSON.stringify(newVariations));
    };

    const removeVariation = (e) => {
        e.preventDefault()
        let newVariations = Array.from(variations)
        let popped = newVariations.pop()
        
        setValues({
            ...values,
            variations: newVariations,
            error: ""
        })
        
    }

    const newPostForm = () => (
        <form className="mb-3" onSubmit={clickSubmit}>
            <h4>Main Photo</h4>
            <div className="form-group">
                <label className="btn btn-secondary">
                    <input
                        onChange={handleChange("photo")}
                        type="file"
                        name="photo"
                        accept="image/*"
                    />
                </label>
            </div>
            <div className="form-group">
                <label className="text-muted">Main Product Name</label>
                <input
                    onChange={handleChange("name")}
                    type="text"
                    className="form-control"
                    value={name}
                    placeholder="Add main product name"
                />
            </div>
            <div className="form-group">
                <label className="text-muted">Description</label>
                <textarea
                    onChange={handleChange("description")}
                    className="form-control"
                    value={description}
                    placeholder="Add description"
                />
            </div>         
            <div className="form-group">
                <label className="text-muted">Category</label>
                <select
                    onChange={handleChange("category")}
                    className="form-control"
                >
                    <option>Please select</option>
                    {categories &&
                        categories.map((c, i) => (
                            <option key={i} value={c._id}>
                                {c.name}
                            </option>
                        ))}
                </select>
            </div>
            <div>
                    <button onClick={addVariation}>Add variation</button>
                    </div>
                    {variations ? VariationComponent() : null}
            <br />
            <br />
            <button type="submit" className="btn btn-outline-primary">Create Product</button>
        </form>
    );

return (
        <Layout>
            <div className="row">
                <div className="col-md-8 offset-md-2">
                    {newPostForm()}                    
                </div>
            </div>
        </Layout>
    );
};

export default AddProduct;

Every time Add variation is clicked, another VariationComponent form is appended to the page . For example, if Add variation button was clicked 3 times, it would result in 3 VariationComponent forms with 3 attached Remove variation buttons. Unfortunately, I do not see how to tell React the position of the #2 item in variations to remove it so I resorted to solving this with .pop(), which is not what I want.

How can I tell React to remove the right array item when Remove variation button is clicked?

rom

Thanks to @RobinZigmond's and @7iiBob's answers, I was able to solve this by this code:

    const removeVariation = (e, num) => {
        e.preventDefault();
      
        setValues({
          ...values,
          variations: variations.filter(item => item.number !== num),
          error: ''
        });
      };

Remove variation button:

<button onClick={(e) => removeVariation(e, variations[i].number)} className="btn-danger">
    {`Remove Variation`}
</button>

Keep in mind the empty variation object looks like this:

        { 
            number: n,
            vname: "",
            vprice: "",
            vquantity: "",
            vshipping: ""
        }

and n is coming from addVariation here:

    const addVariation = (e) => {
        e.preventDefault()
        setAddVar(addVar + 1)
        let oldV = Array.from(variations); // gets current variations
        let n = oldV.length; // get current array position
        console.log(`Current number of variations is: ${n}`);
        let vPost = [{ 
            number: n,
            vname: "",
            vprice: "",
            vquantity: "",
            vshipping: ""
        }]  
        let newV = oldV.concat(vPost);         
        setValues({
            ...values,
            variations: newV,
            error: ""
        })
    }

これは私に何時間もの頭痛を要したので、心から感謝します!

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

変更せずに反応状態配列を複製するにはどうすればよいですか?

分類Dev

反応ネイティブで配列に状態値を設定するにはどうすればよいですか?

分類Dev

反応でredux状態からデータをプルするにはどうすればよいですか?

分類Dev

反応ネイティブでFlatListからアイテム/インデックスを削除するにはどうすればよいですか?

分類Dev

ループなしで場所に応じてMatlabの配列からアイテムを削除するにはどうすればよいですか?

分類Dev

反復中にjsonからアイテムを削除するにはどうすればよいですか?

分類Dev

反応ネイティブで状態キーと値のペアを動的に設定するにはどうすればよいですか?

分類Dev

反応ネイティブとFacebook SDKでユーザーアカウントの状態を管理するにはどうすればよいですか?

分類Dev

setStateの直後にsetTimeoutで反応状態を変更するにはどうすればよいですか?

分類Dev

反応中の状態を部分的に更新するにはどうすればよいですか?

分類Dev

反応中の状態の配列をフィルタリングするにはどうすればよいですか?

分類Dev

反応ネイティブで既存の状態で新しいデータを追加するにはどうすればよいですか?

分類Dev

pymongoを使用してMongoDb配列リストアイテムを反復または削除するにはどうすればよいですか?

分類Dev

APIからネイティブに反応してネストされた配列データを表示するにはどうすればよいですか?

分類Dev

反応ネイティブで既存の状態に値を追加するにはどうすればよいですか?

分類Dev

反応ネイティブで.reduce()を使用して内部状態を変更するにはどうすればよいですか?

分類Dev

反応ネイティブの状態の1つを条件付きでカウントするにはどうすればよいですか?

分類Dev

反応ネイティブボタンの影を削除するにはどうすればよいですか?

分類Dev

反応ネイティブの配列から特定の値を見つけるにはどうすればよいですか?

分類Dev

cartControllerのshopControllerから配列にアクセスして、すべてのアイテムを表示するには(必要に応じて削除するには)どうすればよいですか?

分類Dev

テキストボックスのハンドル変更イベントを使用して、反応配列の状態を更新するにはどうすればよいですか?

分類Dev

Scrapyの応答からアイテムIDを抽出するにはどうすればよいですか?

分類Dev

配列から反対の値を削除するにはどうすればよいですか?

分類Dev

反復された配列REACTの各インデックスの状態を管理するにはどうすればよいですか?

分類Dev

反応コンポーネントをデータベースの状態にバインドするにはどうすればよいですか?

分類Dev

DataFrame列の多くの配列で対応するアイテムの最大値を取得するにはどうすればよいですか?

分類Dev

小道具がフックに反応するように初期状態を設定するにはどうすればよいですか?

分類Dev

ワンライナーで2つの配列の対応するアイテムを比較するにはどうすればよいですか?

分類Dev

反復中にリストからアイテムを削除するにはどうすればよいですか?

Related 関連記事

  1. 1

    変更せずに反応状態配列を複製するにはどうすればよいですか?

  2. 2

    反応ネイティブで配列に状態値を設定するにはどうすればよいですか?

  3. 3

    反応でredux状態からデータをプルするにはどうすればよいですか?

  4. 4

    反応ネイティブでFlatListからアイテム/インデックスを削除するにはどうすればよいですか?

  5. 5

    ループなしで場所に応じてMatlabの配列からアイテムを削除するにはどうすればよいですか?

  6. 6

    反復中にjsonからアイテムを削除するにはどうすればよいですか?

  7. 7

    反応ネイティブで状態キーと値のペアを動的に設定するにはどうすればよいですか?

  8. 8

    反応ネイティブとFacebook SDKでユーザーアカウントの状態を管理するにはどうすればよいですか?

  9. 9

    setStateの直後にsetTimeoutで反応状態を変更するにはどうすればよいですか?

  10. 10

    反応中の状態を部分的に更新するにはどうすればよいですか?

  11. 11

    反応中の状態の配列をフィルタリングするにはどうすればよいですか?

  12. 12

    反応ネイティブで既存の状態で新しいデータを追加するにはどうすればよいですか?

  13. 13

    pymongoを使用してMongoDb配列リストアイテムを反復または削除するにはどうすればよいですか?

  14. 14

    APIからネイティブに反応してネストされた配列データを表示するにはどうすればよいですか?

  15. 15

    反応ネイティブで既存の状態に値を追加するにはどうすればよいですか?

  16. 16

    反応ネイティブで.reduce()を使用して内部状態を変更するにはどうすればよいですか?

  17. 17

    反応ネイティブの状態の1つを条件付きでカウントするにはどうすればよいですか?

  18. 18

    反応ネイティブボタンの影を削除するにはどうすればよいですか?

  19. 19

    反応ネイティブの配列から特定の値を見つけるにはどうすればよいですか?

  20. 20

    cartControllerのshopControllerから配列にアクセスして、すべてのアイテムを表示するには(必要に応じて削除するには)どうすればよいですか?

  21. 21

    テキストボックスのハンドル変更イベントを使用して、反応配列の状態を更新するにはどうすればよいですか?

  22. 22

    Scrapyの応答からアイテムIDを抽出するにはどうすればよいですか?

  23. 23

    配列から反対の値を削除するにはどうすればよいですか?

  24. 24

    反復された配列REACTの各インデックスの状態を管理するにはどうすればよいですか?

  25. 25

    反応コンポーネントをデータベースの状態にバインドするにはどうすればよいですか?

  26. 26

    DataFrame列の多くの配列で対応するアイテムの最大値を取得するにはどうすればよいですか?

  27. 27

    小道具がフックに反応するように初期状態を設定するにはどうすればよいですか?

  28. 28

    ワンライナーで2つの配列の対応するアイテムを比較するにはどうすればよいですか?

  29. 29

    反復中にリストからアイテムを削除するにはどうすればよいですか?

ホットタグ

アーカイブ