ホームページ > ウェブフロントエンド > フロントエンドQ&A > vueコンポーネントに値を渡す方法

vueコンポーネントに値を渡す方法

青灯夜游
リリース: 2023-01-06 17:26:16
オリジナル
2445 人が閲覧しました

値の受け渡し方法: 1. props を使用して親から子に渡します; 2. 子から親に渡します。イベントをカスタマイズする必要があります。「this.$emit('イベント名')」を使用して、子コンポーネントでトリガーし、親で「@event name」を使用してリッスンします; 3. 兄弟間では、パブリックの親要素をブリッジとして使用し、親と子のプロパティを組み合わせてパラメータと子と親のカスタム イベントを渡します。 4. ルートを使用して値を渡す; 5. $ref を使用して値を渡す; 6. 依存関係注入を使用して子孫と曾孫に渡す; 7. $attrs を使用する; 8. $listeners 中間イベントを使用する; 9. $parent を使用する渡すなど

vueコンポーネントに値を渡す方法

#このチュートリアルの動作環境: Windows7 システム、vue3 バージョン、DELL G3 コンピューター。

この記事では、Vue コンポーネントで値を転送する 10 の方法について説明します。一般的に使用される方法は 5 ~ 6 つあります。概要図から始めましょう:


vueコンポーネントに値を渡す方法

1. 親コンポーネントを子コンポーネントに渡す

子コンポーネント内の props、つまり props を定義します。 ['msg']、msg はオブジェクトにすることもできます。基本的なデータ型にすることもできます。

デフォルト値を定義する場合、つまり props:{msg: {type: String,default: 'hello world'}} ,

デフォルト値がオブジェクトの場合 type :props: { msg: { type: Object,default: () => { return { name: 'dan_seek' } } }}

次のようになります。この種の値の転送は一方向であることに注意してください。親コンポーネントの値は変更できません (もちろん参照型を除く)。props の値が直接変更された場合は、警告が報告されます。

推奨される記述方法は、data() で変数を再定義し (Children.vue を参照)、それにプロパティを割り当てることです。もちろん、計算されたプロパティも機能します。

#Children.vue

<template>
    <section>
        父组件传过来的消息是:{{myMsg}}
    </section>
</template>

<script>
    export default {
        name: "Children",
        components: {},
        props:[&#39;msg&#39;],
        data() {
            return {
                myMsg:this.msg
            }
        },
        methods: {}
    }
</script>
ログイン後にコピー

Parent.vue

<template>
  <div class="parent">
    <Children :msg="message"></Children>
  </div>
</template>

<script>
import Children from &#39;../components/Children&#39;

export default {
  name: &#39;Parent&#39;,
  components: {
      Children
  },
  data() {
      return {
          message:&#39;hello world&#39;
}
},
}
</script>
ログイン後にコピー

#2. 子コンポーネントを親コンポーネントに渡すここではカスタム イベントを使用する必要があります。子コンポーネントで this.$emit('myEvent') を使用してトリガーし、親コンポーネントで @myEvent を使用して

Children.vue

<template>
    <div class="parent">
        这里是计数:{{parentNum}}
        <Children-Com @addNum="getNum"></Children-Com>
    </div>
</template>

<script>
    import ChildrenCom from &#39;../components/Children&#39;

    export default {
        name: &#39;Parent&#39;,
        components: {
            ChildrenCom
        },
        data() {
            return {
                parentNum: 0
            }
        },
        methods:{
            // childNum是由子组件传入的
            getNum(childNum){
                this.parentNum = childNum
            }
        }
    }
</script>
ログイン後にコピー

Parent.vue

<template>
    <div class="parent">
        这里是计数:{{parentNum}}
        <Children-Com @addNum="getNum"></Children-Com>
    </div></template><script>
    import ChildrenCom from &#39;../components/Children&#39;

    export default {
        name: &#39;Parent&#39;,
        components: {
            ChildrenCom        },
        data() {
            return {
                parentNum: 0
            }
        },
        methods:{
            // childNum是由子组件传入的
            getNum(childNum){
                this.parentNum = childNum            }
        }
    }</script>
ログイン後にコピー

##3. 兄弟コンポーネント間での値の受け渡し

カスタム イベントの使用

emit のトリガーおよびモニタリング機能は、パブリック イベント バスeventBus を定義します。これを介して、中間ブリッジとして任意のコンポーネントに値を渡すことができます。また、eventBus を使用することで、emit についての理解を深めることができます。 EventBus.js

import Vue from &#39;vue&#39;
export default new Vue()
ログイン後にコピー
Children1.vue

<template>
    <section>
        <div @click="pushMsg">push message</div>
        <br>
    </section>
</template>

<script>
    import eventBus from &#39;./EventBus&#39;
    export default {
        name: "Children1",
        components: {},
        data() {
            return {
                childNum:0
            }
        },
        methods: {
            pushMsg(){
            	// 通过事件总线发送消息
                eventBus.$emit(&#39;pushMsg&#39;,this.childNum++)
            }
        }
    }
</script>
ログイン後にコピー

Children2.vue

<template>
    <section>
        children1传过来的消息:{{msg}}
    </section>
</template>

<script>
    import eventBus from &#39;./EventBus&#39;

    export default {
        name: "Children2",
        components: {},
        data() {
            return {
                msg: &#39;&#39;
            }
        },
        mounted() {
        	// 通过事件总线监听消息
            eventBus.$on(&#39;pushMsg&#39;, (children1Msg) => {
                this.msg = children1Msg
            })
        }
    }
</script>
ログイン後にコピー

Parent.vue

<template>
    <div class="parent">
        <Children1></Children1>
        <Children2></Children2>
    </div>
</template>

<script>
    import Children1 from &#39;../components/Children1&#39;
    import Children2 from &#39;../components/Children2&#39;

    export default {
        name: &#39;Parent&#39;,
        components: {
            Children1,
            Children2
        },
        data() {
            return {
            }
        },
        methods:{
        }
    }
</script>
ログイン後にコピー

github からも入手可能オープンソースの vue-bus ライブラリは、https://github.com/yangmingshan/vue-bus#readme

4 を参照してください。ルート

i. 値を渡すには疑問符を使用します

ページ A からページ B にジャンプするときは、これを使用します。$ router.push('/B?name =danseek')ページ B は this.$route.query.name を使用して、ページ Aから渡された値を取得できます

ルーターの違いに注意してくださいそして、route

ii. コロンを使用して値を渡します

次のルートを設定します:

{
    path: &#39;/b/:name&#39;,
    name: &#39;b&#39;,
    component: () => import( &#39;../views/B.vue&#39;)
  },
ログイン後にコピー
取得できますB ページの this.$route.params.name 経由 ルートによって渡される名前の値

iii. 親子コンポーネントを使用して値を渡します

router-view 自体もコンポーネントであるため、親子コンポーネント値転送メソッドを使用して値を渡し、対応するサブページに props を追加することもできます。型が更新された後に更新されないため、サブページのマウントされたフックで最新の型値を直接取得することはできませんが、watch を使用します。

<router-view :type="type"></router-view>
ログイン後にコピー
// 子页面
......
props: [&#39;type&#39;]
......
watch: {
            type(){
                // console.log("在这个方法可以时刻获取最新的数据:type=",this.type)
            },
        },
ログイン後にコピー

5. $ref を使用して値を渡す

$ref の機能を使用して子コンポーネントの ID を定義します。親コンポーネントは子コンポーネントに直接アクセスできます。メソッドとプロパティまず子コンポーネント Children.vue

<template>
    <section>
        传过来的消息:{{msg}}
    </section>
</template>

<script>
    export default {
        name: "Children",
        components: {},
        data() {
            return {
                msg: &#39;&#39;,
                desc:&#39;The use of ref&#39;
            }
        },
        methods:{
            // 父组件可以调用这个方法传入msg
            updateMsg(msg){
                this.msg = msg
            }
        },
    }
</script>
ログイン後にコピー

を次に親コンポーネント Parent.vue で Children.vue を参照し、ref 属性

<template>
    <div class="parent">
        <!-- 给子组件设置一个ID ref="children" -->
        <Children ref="children"></Children>
        <div @click="pushMsg">push message</div>
    </div>
</template>

<script>
    import Children from &#39;../components/Children&#39;

    export default {
        name: &#39;parent&#39;,
        components: {
            Children,
        },
        methods:{
            pushMsg(){
                // 通过这个ID可以访问子组件的方法
                this.$refs.children.updateMsg(&#39;Have you received the clothes?&#39;)
                // 也可以访问子组件的属性
                console.log(&#39;children props:&#39;,this.$refs.children.desc)
            }
        },
    }
</script>
ログイン後にコピー
を定義します。

6. 依存関係の注入を使用して、子孫や曾孫に渡します

#親コンポーネントに getName() メソッドがあり、次のことを行う必要があるとします。すべての子孫に提供します
provide: function () {
  return {
    getName: this.getName()
  }
}
ログイン後にコピー
provide オプションを使用すると、子孫コンポーネントに提供するデータ/メソッドを指定できます

その後、任意の子孫コンポーネントで

inject# を使用できます## 親コンポーネントを現在のインスタンスに挿入する データ/メソッド:

inject: [&#39;getName&#39;]
ログイン後にコピー

Parent.vue

<template>
    <div class="parent">
        <Children></Children>
    </div>
</template>

<script>
    import Children from &#39;../components/Children&#39;

    export default {
        name: &#39;Parent&#39;,
        components: {
            Children,
        },
        data() {
            return {
                name:&#39;dan_seek&#39;
            }
        },
        provide: function () {
            return {
                getName: this.name
            }
        },
    }
</script>
ログイン後にコピー

Children.vue<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;"><template> <section> 父组件传入的值:{{getName}} </section> </template> <script> export default { name: "Children", components: {}, data() { return { } }, inject: [&amp;#39;getName&amp;#39;], } </script></pre><div class="contentsignin">ログイン後にコピー</div></div>

# 7、祖先の孫 $attrs

通常、中間遷移として父のプロパティを使用する必要がありますが、この方法では、父コンポーネントは親とは関係のないいくつかの属性を持つことになります。コンポーネントのビジネスであり、結合度は高いです。$attrs と祖先と孫の助けを借りて簡素化できます。変更は必要ありません

GrandParent.vue
<template>
    <section>
        <parent name="grandParent" sex="男" age="88" hobby="code" @sayKnow="sayKnow"></parent>
    </section>
</template>

<script>
    import Parent from &#39;./Parent&#39;
    export default {
        name: "GrandParent",
        components: {
          Parent
        },
        data() {
            return {}
        },
        methods: {
          sayKnow(val){
            console.log(val)
          }
        },
        mounted() {
        }
    }
</script>
ログイン後にコピー
Parent.vue
<template>
  <section>
    <p>父组件收到</p>
    <p>祖父的名字:{{name}}</p>
    <children v-bind="$attrs" v-on="$listeners"></children>
  </section>
</template>

<script>
  import Children from &#39;./Children&#39;

  export default {
    name: "Parent",
    components: {
      Children
    },
    // 父组件接收了name,所以name值是不会传到子组件的
    props:[&#39;name&#39;],
    data() {
      return {}
    },
    methods: {},
    mounted() {
    }
  }
</script>
ログイン後にコピー

Children.vue

<template>
  <section>
    <p>子组件收到</p>
    <p>祖父的名字:{{name}}</p>
    <p>祖父的性别:{{sex}}</p>
    <p>祖父的年龄:{{age}}</p>
    <p>祖父的爱好:{{hobby}}</p>

    <button @click="sayKnow">我知道啦</button>
  </section>
</template>

<script>
  export default {
    name: "Children",
    components: {},
    // 由于父组件已经接收了name属性,所以name不会传到子组件了
    props:[&#39;sex&#39;,&#39;age&#39;,&#39;hobby&#39;,&#39;name&#39;],
    data() {
      return {}
    },
    methods: {
      sayKnow(){
        this.$emit(&#39;sayKnow&#39;,&#39;我知道啦&#39;)
      }
    },
    mounted() {
    }
  }
</script>
ログイン後にコピー

結果の表示

父组件收到
祖父的名字:grandParent
子组件收到
祖父的名字:
祖父的性别:男
祖父的年龄:88
祖父的爱好:code
ログイン後にコピー

8. Sun Chuanzu
$listeners 中間イベントの助けを借りて、Sun は先祖に簡単に通知できます。コード例については、7

##9、$parent

を参照してください。 #親を通じて親コンポーネントのインスタンスを取得でき、このインスタンスを通じて親コンポーネントのプロパティとメソッドにアクセスできます。兄弟ルートもあり、ルートコンポーネントのインスタンスを取得できます。

语法:

// 获父组件的数据
this.$parent.foo

// 写入父组件的数据
this.$parent.foo = 2

// 访问父组件的计算属性
this.$parent.bar

// 调用父组件的方法
this.$parent.baz()
ログイン後にコピー

于是,在子组件传给父组件例子中,可以使用this.$parent.getNum(100)传值给父组件。

10、sessionStorage传值

sessionStorage 是浏览器的全局对象,存在它里面的数据会在页面关闭时清除 。运用这个特性,我们可以在所有页面共享一份数据。

语法:

// 保存数据到 sessionStorage
sessionStorage.setItem(&#39;key&#39;, &#39;value&#39;);

// 从 sessionStorage 获取数据
let data = sessionStorage.getItem(&#39;key&#39;);

// 从 sessionStorage 删除保存的数据
sessionStorage.removeItem(&#39;key&#39;);

// 从 sessionStorage 删除所有保存的数据
sessionStorage.clear();
ログイン後にコピー

注意:里面存的是键值对,只能是字符串类型,如果要存对象的话,需要使用 let objStr = JSON.stringify(obj) 转成字符串然后再存储(使用的时候 let obj = JSON.parse(objStr) 解析为对象)。

这样存对象是不是很麻烦呢,推荐一个库 good-storage ,它封装了sessionStorage ,可以直接用它的API存对象

// localStorage
 storage.set(key,val) 
 storage.get(key, def)
 
 // sessionStorage
 storage.session.set(key, val)
 storage.session.get(key, val)
ログイン後にコピー

更多请移步:https://github.com/ustbhuangyi/storage#readme

【相关推荐:vuejs视频教程web前端开发

以上がvueコンポーネントに値を渡す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
関連するチュートリアル
人気のおすすめ
最新のコース
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート