vue3学习笔记

121 阅读1分钟

一,vue3环境搭建

1.npm install -g @vue/cli 2.vue create name ? Please pick a preset: (Use arrow keys) //请选择预选项

Default ([Vue 2] babel, eslint) //使用Vue2默认模板进行创建 Default (Vue 3 Preview) ([Vue 3] babel, eslint) //使用Vue3默认模板进行创建 Manually select features //手动选择(自定义)的意思

二,ref,reactive使用

<template>
    <div>
        <h1>{{ num }}</h1>
        <button @click="add">递增</button>
        <h2>{{ objName.name }}今年{{ objName.age }}岁</h2>
        <button @click="setAge">修改年龄</button>
    </div>
</template>
<script setup>
import {  ref , reactive ,isRef,} from "vue";
 let money=ref(88);
  let objName=reactive({
    name:'张三',
    age:12,
    motion:[123,456,789]
  });`
   let add=()=>{
    num.value++
  }
  const setMoney=computed(()=>{
    const p=money.value+100
    return p
  })
  console.log('isRef的使用',isRef(objName));
  console.log('isRef的使用',isRef(num));
<script>

三:computed , watch, onBeforeMount, onMounted使用

<template>
  <div class="home">
    <h1>{{ num }}</h1>
    <button @click="add">递增</button>

    <h2>{{ objName.name }}今年{{ objName.age }}岁</h2>
    <button @click="setAge">修改年龄</button>
    <ul>
      <li v-for="(item,i) in objName.motion" :key="i">{{ item }}</li>
    </ul>
    <h3>计算属性{{ setMoney }}</h3>
    <ul>
      <li v-for="(v,i) in arr" :key="i">{{ v }}</li>
    </ul>
    <ul>
      <li v-for="(v,i) in arr1" :key="i">{{ v }}</li>
    </ul>
    ------------------------------------------
  
  </div>
</template>

<script setup>
  import {  ref , reactive ,isRef, computed , watch, onBeforeMount, onMounted,provide} from "vue";
  
  let num=ref(0);
  let money=ref(88);
  let objName=reactive({
    name:'张三',
    age:12,
    motion:[123,456,789]
  });
  let add=()=>{
    num.value++
  }
  const setMoney=computed(()=>{
    const p=money.value+100
    return p
  })
  let setAge=()=>{
    objName.age=38
  }
  watch(num,(newNum,oldNum)=>{
    console.log('新值',newNum);
    console.log('旧值',oldNum);
  })
  watch(()=>objName.age,(newNum,oldNum)=>{
    console.log('新值',newNum);
    console.log('旧值',oldNum);
  })
  onBeforeMount(()=>{
    console.log('创建前');
  })
  onMounted(()=>{
    console.log('创建后');
  })
 
  console.log('isRef的使用',isRef(objName));
  console.log('isRef的使用',isRef(num));
</script>

四:父子组件传参 defineProps,defineEmits defineExpose provide/inject

父组件:HomeView.vue
<template>
  <div class="home">
    <ul>
      <li v-for="(v,i) in arr" :key="i">{{ v }}</li>
    </ul>
    <ul>
      <li v-for="(v,i) in arr1" :key="i">{{ v }}</li>
    </ul>
    ------------------------------------------
    <hello :num="num" @getVal="getVal" ref="testcomRef"/>
  </div>
</template>

<script setup>
  import {  ref , reactive ,isRef, computed , watch, onBeforeMount, onMounted,provide} from "vue";
  import hello from "../components/HelloWorld.vue";

  //provide
  const provideData=ref('provide的使用')
  provide('provideData',provideData)
  let num=ref(122);
  let arr=ref([])
  // const stop1 = watch([num], ([newNum],[oldNum]) => {
  //   console.log('num', newNum) // false
  //   console.log('usr', oldNum ) // true
  // })
  let arr1=ref()

  let testcomRef=ref()
  //获取子传的参数
  let getVal=(value)=>{
    console.log('子传过来的参数',value);
    arr.value=value
    arr1.value=testcomRef.value.data.list
    console.log('子组件中定义的属性值',testcomRef.value.data);
  }

</script>


//子组件HelloWorld.vue
<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <h3>父传的参数 {{props.num }}</h3>
   <ul>
      <li v-for="(item,i) in data.list" :key="i">{{ item }}</li>
   </ul>
   <button @click="send" >子传父</button>

   <h3>provide/inject:{{ injectData }}</h3>
  </div>
</template>

<script setup>
  import { ref ,defineProps,defineEmits,defineExpose,inject} from "vue";

  //provide以及inject的使用
  const injectData=inject('provideData','默认值')

  let data=ref({
    list:['掌声','蹲下']
  })
  let props=defineProps({
    num:{
      type:Number,
      default:0
    }
  })
  let emit=defineEmits(['getVal'])
  let send=()=>{
    let list1=[0,22,34,44]
     emit('getVal', list1);
  }
  //父组件获取子组件中的属性值 需要使用defineExpose
  defineExpose({data})
  let msg=ref('这是子组件')
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped lang="scss">
h3 {
  margin: 40px 0 0;
}
ul {
  list-style-type: none;
  padding: 0;
}
li {
  display: inline-block;
  margin: 0 10px;
}
a {
  color: #42b983;
}
</style>