Vue3.0拿来吧你!!!

2021-07-25  本文已影响0人  又菜又爱分享的小肖

为什么学习Vue3.0?

关于框架

关于自己

vite是什么?

npm init vite-app 项目名
cd 项目名
npm i
npm run dev

选项API和组合API

什么是选项API?

<template>
  <div>
      <div>{{y}}</div>
      <div>{{x}}</div>
      <button @click="add">{{count}}</button>
  </div>
</template>

<script>
export default {
    data() {
        return {
            x:0,
            y:0,
            count:0
        }
    },
    mounted(){
        document.addEventListener('mousemove',this.move);
    },
    methosd:{
        add(){
            this.count++;
        },
        move(e){
            this.x = e.pageX;
            this.y = e.pageY;
        }
    }
}
</script>

组合api写法

<template>
  <div>
      <div>{{obj.x}}</div>
      <div>{{obj.y}}</div>
      <button @click="add">{{obj.count}}</button>
  </div>
</template>

<script>
import { onMounted, reactive} from 'vue'
export default {
setup(){
    const obj = reactive({
        x:0,
        y:0,
        count:0
    });
    console.log(obj);
    const move = (e) =>{
        obj.x = e.pageX;
        obj.y = e.pageY;
    }
    const add = () => {
        obj.count++
    }
    onMounted(()=>{
        document.addEventListener('mousemove',move)
    })
    return {obj, add};
}
}
</script>

组合API-setUP函数

<template>
  <div>
      {{msg}}
  </div>
</template>

<script>
export default {
setup(){
    const msg = '哈哈哈';
    console.log(this); //undefined
    return {msg}
},
beforeCreate() {
  console.log(this);  //Proxy {…}
},
}
</script>

组合API-生命周期

组合API-reactive函数定义响应式数据。

<template>
  <div>
      <div>{{obj.name}}</div>
      <div>{{obj.age}}</div>
      <button @click="btn"></button>
  </div>
</template>

<script>
import { reactive } from 'vue'
export default {
setup(){
    const obj = reactive({
        name:'xxj',
        age:21
    })
    const btn = () =>{
        obj.name = 'xxx';
        obj.age = 100
    }
    return {obj, btn};
}
}
</script>

组合API-toRef函数

<template>
  <div>
      <div>{{age}}</div>
      <button @click="btn">按钮</button>
  </div>
</template>

<script>
import {reactive, toRef } from 'vue'
export default {
setup(){
    const obj = reactive({
        name:'xxj',
        age:21
    });
    let age = toRef(obj,'age');
    const btn = () =>{
        age.value = 100
    }
    return {age, btn};
}
}
</script>

组合API-toRefs函数

<template>
  <div>
      <div>{{name}}</div>
      <div>{{age}}</div>
      <button @click="btn"></button>
  </div>
</template>

<script>
import {reactive, toRefs } from 'vue'
export default {
setup(){
    const obj = reactive({
        name:'xxj',
        age:21
    });
    const btn = () =>{
        obj.name = 'xxx',
        obj.age = 100
    }
    return {...toRefs(obj),btn}
}
}
</script>

组合API-ref函数

<template>
  <div>
      <div>{{num}}</div>
      <button @click="btn"></button>
  </div>
</template>

<script>
import {ref} from 'vue'
export default {
setup(){
    let num = ref(0);
    const btn = () =>{
        num.value++;
    }
    return {num, btn}
}
}
</script>

组合API-computed函数

基本用法

<template>
  <div>
      <div>{{obj.age}}</div>
      <button>{{newage}}</button>
  </div>
</template>

<script>
import {computed, ref} from 'vue'
export default {
setup(){
    const obj = {
        name:'xxj',
        age:21
    }
    const newage = computed(()=>{
        return obj.age + 2;
    })
    return {obj, newage};
}
}
</script>

高级用法

<template>
  <div>
      <div>{{age}}</div>
      <input type="text" v-model="newage">
  </div>
</template>

<script>
import {computed, ref} from 'vue'
export default {
setup(){
    const age = ref(21);
    const newage = computed({
        //get函数,获取计算属性的值
        get(){
            return age.value + 2;
        },
        // set函数,当你给计算属性设置值的时候触发
        set(value){
            console.log(value);
            age.value = value - 2;
        }
    })
    return {age, newage};
}
}
</script>

组合API-watch侦听器

<template>
  <div>
      <div>{{count}}</div>
      <button @click="add"></button>
  </div>
</template>

<script>
import {ref, watch} from 'vue'
export default {
setup(){
    const count = ref(0);
    const add = () =>{
        count.value++;
    }
    watch(count,(n,o)=>{ // 监听某个变量
        console.log(n,o); //返回新值 旧值
    },{
        //深度监听
        deep:true,
        //默认执行
        immediate:true
    })
    // 监听多个数据变化
    watch([count,obj], ()=>{
        console.log('改变了')
    })

    // 监听对象中某一个属性的变化,例如:obj.name
    // 需要写成函数返回该属性的方式才能监听到
    watch(()=>obj.name, ()=>{
        console.log('改变了');
    })
    return {count, add}
}
}
</script>

组合API-ref属性

<template>
  <div>
      <div ref="dom">我是box</div>
      <ul>
          <li v-for="(item,index) in 5" :key="index" :ref="setDom">{{item}}</li>
      </ul>
  </div>
</template>

<script>
import {onMounted, ref, watch} from 'vue'
export default {
setup(){
    const dom = ref(null);
    // 获取单个元素
    //定义一个空的响应式数据ref定义的
    //setup中返回该数据,你想获取那个dom元素,在该元素上使用ref属性绑定该数据即可。
    onMounted(()=>{
        console.log(dom.value); // DOM渲染完毕执行 获取
        console.log(DOMList);
    })

    // 获取v-for遍历的元素
    // 定义一个空数组,接收所有的li
    // 定义一个函数,往空数组push DOM
    const DOMList= [];
    const setDom = (el) =>{
        console.log(el);
        DOMList.push(el);
    }
    return {dom, setDom}
}
}
</script>

组合API-父子通讯

父组件

<template>
  <div>
    <h1>父组件</h1>
    <Son v-model:message="message"></Son>
  </div>
</template>

<script>
import Son from "./Son.vue";
import { ref } from "vue";
export default {
  components: {
    Son,
  },
  setup() {
    let message = ref("啊哈");
    const update = (val) => {
      console.log(val);
      message.value = val;
    };
    return { message, update };
  },
};
</script>

<style>
</style>

子组件

<template>
  <div>
    <h1>子组件</h1>
    {{ message }}
    <button @click="btn">子传父</button>
  </div>
</template>

<script>
import { onMounted } from "vue";
export default {
  props: {
    message: {
      type: String,
      default: 0,
    },
  },
  setup(props, { emit }) {
    // 获取父组件数据money
    // console.log(props.message);
    onMounted(() => {
      console.log(props.message);
    });
    const btn = () => {
      //传给父组件
      emit("update:message", "哈哈哈");
    };
    return { btn };
  },
};
</script>

依赖注入

使用场景:有一个父组件,里面有一个子组件,有孙组件,有很多后代组件,共享父组件数据。
父组件

<template>
  <div>
    <h1>父组件</h1>
    <Son></Son>
  </div>
</template>

<script>
import Son from "./Son.vue";
import { provide, ref } from "vue";
export default {
  components: {
    Son,
  },
  setup() {
    let money = ref(100);
    const changeMoney = (val) => {
      //后代组件返回的值对父组件进行修改
      money.value = val;
    };
    // 将数据提供给后代组件
    provide("money", money);
    //将函数提供给后代组件 provide
    provide("changeMoney", changeMoney);
  },
};
</script>

子组件

<template>
  <div>
    <h1>子组件</h1>
    {{ money }}
    <GrandSon></GrandSon>
  </div>
</template>

<script>
import { inject } from "vue";
import GrandSon from "./GrandSon.vue";
export default {
  components: {
    GrandSon,
  },
  setup() {
    // 接收祖先组件提供的组件
    const money = inject("money");
    return { money };
  },
};
</script>

孙组件

<template>
  <div>孙组件</div>
  <button @click="fn">修改金额</button>
  {{ money }}
</template>

<script>
import { inject } from "vue";
export default {
  setup() {
    // 接收祖先组件提供的组件
    const money = inject("money");
    // 不能自己修改数据,谁定义谁修改
    const changeMoney = inject("changeMoney"); //获取父组件传来的方法
    const fn = () => {
      changeMoney(20); // 调用
    };
    return { money, fn };
  },
};
</script>
上一篇 下一篇

猜你喜欢

热点阅读