美文网首页
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