引数に基づいてグリマーコンポーネントの初期状態を設定するにはどうすればよいですか?

ケーシーグルン

私は、データを下に実装し、アクションをきらめくコンポーネント階層で上に実装する方法を理解するのに苦労しています(Ember Octane、v3.15を使用)。

アイテムのリストを持つ親コンポーネントがあります。ユーザーがParentコンポーネント内のボタンをクリックしたときに、Editor関連するアイテムのデータをコンポーネントに入力したいと思います。ユーザーがEditorコンポーネント内で[保存]をクリックすると、変更を親に戻します。代わりに次のようになります。

私のアプリのGIF

テキストボックスに「こんにちは」と入力し、「保存」をクリックしたときに変更を上記のリストに保持するにはどうすればよいですか?

コード

{{!-- app/components/parent.hbs --}}
<ul>
{{#each this.models as |model|}}
    <li>{{model.text}} <button {{on 'click' (fn this.edit model)}}>Edit</button></li>
{{/each}}
</ul>

<Editor @currentModel={{this.currentModel}} @save={{this.save}} />
// app/components/parent.js
import Component from '@glimmer/component';
export default class ParentComponent extends Component {
    @tracked models = [
        { id: 1, text: 'Hello'},
        { id: 2, text: 'World'}
    ]
    @tracked currentModel = null;

    @action
    edit(model) {
        this.currentModel = model;
    }

    @action
    save(model) {
        // persist data
        this.models = models.map( (m) => m.id == model.id ? model : m )
    }
}
{{!-- app/components/editor.hbs --}}
{{#if @currentModel}}
<small>Editing ID: {{this.id}}</small>
{{/if}}
<Input @value={{this.text}} />
<button {{on 'click' this.save}}>Save</button>
// app/components/editor.hbs
import Component from '@glimmer/component';
import { tracked } from "@glimmer/tracking";
import { action } from "@ember/object";

export default class EditorComponent extends Component {
    @tracked text;
    @tracked id;

    constructor() {
        super(...arguments)
        if (this.args.currentModel) {
            this.text = this.args.currentModel.text;
            this.id = this.args.currentModel.id;
        }

    }

    @action
    save() {
        // persist the updated model back to the parent
        this.args.save({ id: this.id, text: this.text })
    }
}

理論的根拠/問題

Editorステートフルコンポーネントとして実装することにしました<Input />。これは、コンポーネントからフォームデータを取得するための最も慣用的な方法のように思われたためです。を使用して初期状態を設定しargsます。以来はthis.currentModelある@trackedParentComponentし、私が更新するために、そのプロパティの再割り当てを期待する@currentModelに渡される引数をEditor

実際、次の内のいずれかの項目に「編集」をクリックするので、ケースのように思われるParentComponent可能<small>Editing ID: {{this.id}}</small>表示されます。ただし、<Input />要素の値id入力もされません

私はそれを理解してthis.textおり、親の変更時にofが再実行されないthis.idため、更新されていません...しかし、代わりに何をすべきかについて悩んでいます。constructorEditorComponentcurrentModel


私が試したこと

これを理解しようとしていたときに、hbs)とhbsjs)の間でほぼ同じ相互作用を持つこの例コード)に出くわしました私の問題に適用される彼らの解決策は、次のようにEditorComponentを書くことです。BlogAuthorComponentBlogAuthorEditComponent

{{!-- app/components/editor.hbs --}}
{{#if this.isEditing}}
<small>Editing ID: {{@currentModel.id}}</small>
<Input @value={{@currentModel.text}} />
<button {{on 'click' this.save}}>Save</button>
{{/if}}
// app/components/editor.hbs
import Component from '@glimmer/component';
import { tracked } from "@glimmer/tracking";
import { action } from "@ember/object";

export default class EditorComponent extends Component {
    get isEditing() {
        return !!this.args.currentModel
    }

    @action
    save() {
        // persist the updated model back to the parent
        this.args.save({ id: this.id, text: this.text })
    }
}

ここに画像の説明を入力してください

できます!子コンポーネントに渡さ何かのプロパティを変更する- :しかし、私はいくつかの理由のため、この解決策、好きではないarg中であるため、それは(すべてで動作し、なぜそうです...不気味な...私はわからないんだけど正直ParentComponent#modelsです@tracked、その配列内のPOJOのプロパティがフォローされることは期待していません...)-これにより、入力時にテキストが更新さParentComponentれますが、これは私が望むものではありません---変更のみを永続化する必要がありますユーザーが[保存]をクリックしたとき(この場合は何もしません)-私の実際のアプリでは、ユーザーが既存のアイテムを「編集」していないときに、フォームを「アイテムの追加」フォームにします。 「保存」ボタンは新しいアイテムを追加します。私'<Input @value

私もこの質問出くわしましたが、それは古いバージョンのグリマーを参照しているようです。

ここまで読んでいただきありがとうございます---アドバイスをいただければ幸いです。

noobs4ibot1

コンポーネントcurrentModel内のへの変更を追跡しeditor、デフォルト値を設定するには、getアクセサを使用します。

get model() {
  return this.args.currentModel || { text: '', id: null };
}

そして、テンプレートで次のことを行います。

{{#if this.model.id}}
  <small>
    Editing ID:
    {{this.model.id}}
  </small>
{{/if}}
<Input @value={{this.model.text}} />
<button type="button" {{on "click" this.save}}>
  Save
</button>

ただし、これはコンポーネント内で変化currentModelすることに注意してください。これは、あなたparentが望むものではないと思います。これを回避するには、編集しているモデルのプロパティから新しいオブジェクトを作成します。

解決:

// editor/component.js
export default class EditorComponent extends Component {
  get model() {
    return this.args.currentModel;
  }

  @action
  save() {
    this.args.save(this.model);
  }
}

親コンポーネントで、渡されたモデルから新しいオブジェクトを作成します。また、currentModel保存アクションでリセットすることを忘れないでくださいこれidで、parentコンポーネントのsaveアクションでnullかどうかを確認でき、nullの場合は、saveロジックを実装するだけです。

// parent/component.js
@tracked currentModel = {};

@action
edit(model) {
  // create a new object
  this.currentModel = { ...model };
}

@action
save(model) {
  if (model.id) {
    this.models = this.models.map((m) => (m.id == model.id ? model : m));
  } else {
    // save logic
  }

  this.currentModel = {};
}

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

変数の出力に基づいてReactWebアプリでコンポーネントの幅を設定するにはどうすればよいですか?

分類Dev

子コンポーネントに状態を設定するにはどうすればよいですか?

分類Dev

Reduxの状態変更に基づいてReactコンポーネントのsetState()を作成するにはどうすればよいですか?

分類Dev

親コンポーネントからEmberコンポーネントの内部状態を設定するにはどうすればよいですか?

分類Dev

子コンポーネントと親コンポーネントの状態を正しく設定するにはどうすればよいですか?

分類Dev

reactjsとreluxeで子からコンテナコンポーネントの状態を設定するにはどうすればよいですか?

分類Dev

状態が変化した後、Reactが再レンダリングされないのですが、子コンポーネントの状態を設定するにはどうすればよいですか?

分類Dev

App.jsの状態に基づいて、兄弟コンポーネントのテキストを更新する1つの子コンポーネントにonClickメソッドを実装するにはどうすればよいですか?

分類Dev

ビデオエンドのコンポーネントの状態をreactで設定するにはどうすればよいですか?

分類Dev

Vue:親データに基づいて動的コンポーネントをレンダリングするにはどうすればよいですか?

分類Dev

マテリアルUIで選択されたテーブル行に基づいてコンポーネントの状態を設定する方法

分類Dev

子コンポーネントが親コンポーネントを介してフィルタリングされるときに子コンポーネントの状態を維持するにはどうすればよいですか?

分類Dev

ペイロードを渡すコンポーネントからReduxで状態を設定するにはどうすればよいですか?

分類Dev

兄弟コンポーネントによって設定されたURLに基づいてReactコンポーネントをリロードするにはどうすればよいですか?

分類Dev

componentWillUnmountに保存されているコンポーネントのredux状態をクリアするにはどうすればよいですか?

分類Dev

Reactコンポーネントの状態を更新するにはどうすればよいですか?

分類Dev

反応中の状態内のコンポーネントをレンダリングするにはどうすればよいですか?

分類Dev

React:状態変数を使用して別のコンポーネントから関数を実行するにはどうすればよいですか?

分類Dev

インポートされた関数を取得して、機能コンポーネントの状態を設定するにはどうすればよいですか?

分類Dev

Switchコンポーネントを別個の列としてTableコンポーネントに統合し、両方に別個の状態を設定するにはどうすればよいですか?

分類Dev

条件に基づいて初期ビューコントローラを設定するにはどうすればよいですか?

分類Dev

Reactコンポーネントの作成時にRedux状態を初期化するにはどうすればよいですか?

分類Dev

親の状態を子コンポーネントに渡すにはどうすればよいですか?

分類Dev

子コンポーネントの状態を親に渡すにはどうすればよいですか?

分類Dev

エラーに基づいてVueコンポーネントにマークアップを挿入するにはどうすればよいですか?

分類Dev

あるコンポーネントから別のコンポーネントに状態を渡すにはどうすればよいですか?また、状態を変更するにはどうすればよいですか?

分類Dev

vue jsのログインコンポーネントからユーザーの状態を更新するにはどうすればよいですか?

分類Dev

現在のURLに基づいてコンポーネントをインポートするにはどうすればよいですか?

分類Dev

コンポーネントの状態を別のコンポーネントから変更するにはどうすればよいですか?

Related 関連記事

  1. 1

    変数の出力に基づいてReactWebアプリでコンポーネントの幅を設定するにはどうすればよいですか?

  2. 2

    子コンポーネントに状態を設定するにはどうすればよいですか?

  3. 3

    Reduxの状態変更に基づいてReactコンポーネントのsetState()を作成するにはどうすればよいですか?

  4. 4

    親コンポーネントからEmberコンポーネントの内部状態を設定するにはどうすればよいですか?

  5. 5

    子コンポーネントと親コンポーネントの状態を正しく設定するにはどうすればよいですか?

  6. 6

    reactjsとreluxeで子からコンテナコンポーネントの状態を設定するにはどうすればよいですか?

  7. 7

    状態が変化した後、Reactが再レンダリングされないのですが、子コンポーネントの状態を設定するにはどうすればよいですか?

  8. 8

    App.jsの状態に基づいて、兄弟コンポーネントのテキストを更新する1つの子コンポーネントにonClickメソッドを実装するにはどうすればよいですか?

  9. 9

    ビデオエンドのコンポーネントの状態をreactで設定するにはどうすればよいですか?

  10. 10

    Vue:親データに基づいて動的コンポーネントをレンダリングするにはどうすればよいですか?

  11. 11

    マテリアルUIで選択されたテーブル行に基づいてコンポーネントの状態を設定する方法

  12. 12

    子コンポーネントが親コンポーネントを介してフィルタリングされるときに子コンポーネントの状態を維持するにはどうすればよいですか?

  13. 13

    ペイロードを渡すコンポーネントからReduxで状態を設定するにはどうすればよいですか?

  14. 14

    兄弟コンポーネントによって設定されたURLに基づいてReactコンポーネントをリロードするにはどうすればよいですか?

  15. 15

    componentWillUnmountに保存されているコンポーネントのredux状態をクリアするにはどうすればよいですか?

  16. 16

    Reactコンポーネントの状態を更新するにはどうすればよいですか?

  17. 17

    反応中の状態内のコンポーネントをレンダリングするにはどうすればよいですか?

  18. 18

    React:状態変数を使用して別のコンポーネントから関数を実行するにはどうすればよいですか?

  19. 19

    インポートされた関数を取得して、機能コンポーネントの状態を設定するにはどうすればよいですか?

  20. 20

    Switchコンポーネントを別個の列としてTableコンポーネントに統合し、両方に別個の状態を設定するにはどうすればよいですか?

  21. 21

    条件に基づいて初期ビューコントローラを設定するにはどうすればよいですか?

  22. 22

    Reactコンポーネントの作成時にRedux状態を初期化するにはどうすればよいですか?

  23. 23

    親の状態を子コンポーネントに渡すにはどうすればよいですか?

  24. 24

    子コンポーネントの状態を親に渡すにはどうすればよいですか?

  25. 25

    エラーに基づいてVueコンポーネントにマークアップを挿入するにはどうすればよいですか?

  26. 26

    あるコンポーネントから別のコンポーネントに状態を渡すにはどうすればよいですか?また、状態を変更するにはどうすればよいですか?

  27. 27

    vue jsのログインコンポーネントからユーザーの状態を更新するにはどうすればよいですか?

  28. 28

    現在のURLに基づいてコンポーネントをインポートするにはどうすればよいですか?

  29. 29

    コンポーネントの状態を別のコンポーネントから変更するにはどうすればよいですか?

ホットタグ

アーカイブ