美文网首页
Composition API的使用

Composition API的使用

作者: wqjcarnation | 来源:发表于2022-08-24 14:12 被阅读0次

    目标

    • 父子组件传值props 和 context
    • 祖孙组件传值provice和inject
    • 生命周期 on**
    • 编程式路由的使用 useRouter
    • vuex useStore
    • 获取DOM ref

    1. 父子组件传值

    setup() 函数
    setup() 函数有两个参数:props 和 context。

    为什么要有这两个参数呢?我们知道父子组件之间是可以传值。但是现在我们的业务逻辑都写在setup函数中,而setup中没有this指针,那么就只能靠这两个参数来进行传递了。

    ● props:父组件向子组件传值的参数。
    ● context:子组件向父组件传值的参数。

    1.6.1 props

    1、子组件侧用props

        <script>
        export default {
          setup(props, context) {
            console.log(props.msg)
          },
          props: {
            msg: String,
          },
        };
        </script>
    

    2、父组件侧 属性名=值

    <div>
      <Hello msg="hello"></Hello>
    </div>
    

    1.6.2.context参数

    1、子组件context.emit(eventname, 值)
    2、父组件内是@eventname="本地函数"

        <script>
        export default {
          setup(props, context) {
            function send() {
              context.emit("childmsg", "hello world!");
            }
        
            return {
              send,
            };
          },
          props: {
            msg: String,
          },
        };
        </script>
    

    <Hello msg="hello" @childmsg="get"></Hello>
    function get(param) {
    console.log(param)
    }

    2. provide 和inject祖孙间传值

    provide("msg","要给孙子的信息") 相当于set方法
    inject("msg") 相当于get方法

    父组件

        <template>
            <div id="app">
                父组件<br>
                <hello></hello>
            </div>
        </template>
    
        <script>
            import hello from '@/components/hello'
            import {provide} from 'vue'
            export default{
                setup(){
                    provide("msg","要给孙子的信息")
                },
                components:{
                    hello
                }
            }
        </script>
    

    子组件

        <template>
            <div id="container">
                子组件<br>
                <subhello></subhello>
            </div>
        </template>
    
        <script>
            import subhello from '@/components/subhello'
            
            export default{
                setup(){
                },
                components:{subhello}
                
                
            }
        </script>
    

    孙组件

        <template>
            <div id="container">
                孙子组件
            </div>
        </template>
    
        <script>
            import {inject} from 'vue'
            export default{
                setup(){
                    alert("孙子收到的:"+inject("msg"))
                }
            }
        </script>
    

    3.生命周期

    注意:在Composition API中没有beforeCreate()和created()这里两个声明周期函数了,统一使用setup()。注意加on

            <template>
              <div>
                {{ num }}
                <button @click="add">加</button>
              </div>
            </template>
    
            <script>
            import { reactive,toRefs,onBeforeMount,onMounted,onBeforeUpdate,onUpdated,onBeforeUnmount,onUnmounted } from "vue";
    
            export default {
              setup() {
                const state = reactive({
                  num: 1,
                });
    
                function add() {
                  state.num++;
                }
    
                onBeforeMount(() => {
                  console.log("DOM挂载前!");
                });
    
                onMounted(() => {
                  console.log("DOM挂载后!");
                });
    
                onBeforeUpdate(() => {
                  console.log("数据更新前!");
                })
    
                onUpdated(() => {
                  console.log("数据更新后!");
                })
    
                onBeforeUnmount(() => {
                  console.log("实例卸载前!");
                })
    
                onUnmounted(() => {
                  console.log("实例卸载后!");
                })
             
                return {
                  ...toRefs(state),
                  add,
                };
              },
            };
            </script>
    

    4.编程式路由的使用

    ● 先import导入useRouter模块。
    ● 通过useRouter模块获取router对象。以后的路由写法就与前面所学一样了。
    关键代码:

                  <button @click="toHome">Home</button>
                  <button @click="toAbout">About</button>
    
    
        <script>
        import { useRouter } from "vue-router";// 先import导入useRouter模块
    
        export default{
          setup() {
            const router = useRouter();//通过useRouter模块获取router对象
    
            function toHome(){
              router.push('/');
            }
          
            function toAbout(){
              router.push({path:'/about',query:{name:'zhangsan'}});
            }
    
            return {
              toHome,
              toAbout
            }
          },
        }
        </script>
    

    5.vuex--useStore

        <script>
        import { useStore } from "vuex";
    
        export default {
          setup() {
            const store = useStore();
            console.log(store.state.num);
            console.log(store.getters.newnum);
          }
        };
        </script>
    

    6.获取DOM

    ● 在HTML标签中使用 ref 属性标识一个DOM对象。
    ● 需要 import 导入 ref 对象。
    ● 使用 const myRef = ref(null); 的方式获取包装好的DOM对象,命名为HTML中的 ref 属性名。并且此数据需要暴露出去。
    ● 使用 value 属性即可获取 DOM对象。

        <template>
          <div ref="myRef">获取单个DOM元素</div>
        </template>
    
        <script>
        import { ref, onMounted } from 'vue';
    
        export default {
          setup() {
            const myRef = ref(null);   //ref(null)是一个固定的写法
    
            onMounted(() => {
              console.dir(myRef.value);
            });
            return {
              myRef
            };
          }
        };
        </script>
    

    相关文章

      网友评论

          本文标题:Composition API的使用

          本文链接:https://www.haomeiwen.com/subject/crwagrtx.html