美文网首页vuevue3
(VUE3) 二、脚手架(vue-cli和vite & 计算属性

(VUE3) 二、脚手架(vue-cli和vite & 计算属性

作者: Jinx要睡懒觉 | 来源:发表于2022-01-13 19:33 被阅读0次

1.Vue-cli和Vite

在浏览器中中直接运行的这种开发方式已经不用了。现在前后台完全分开,那么前端程序需要借助专业的开发工具去做,那么专业开发工具有很多,比如webpack、rollup、尤雨溪搞的vite等,webpack是目前最主流的前端开发工具,叫打包器,就是我们用webpack去开发,开发好以后打个包。脚手架的背后就是在用webpack在打包。

(1) Vue CLI

Vue CLI 4.x以上,Node.js版本 8.9以上

npm install -g @vue/cli
# OR
yarn global add @vue/cli
# 查看版本
vue --version

# 创建项目
vue create hello-world
# 运行
npm run serve

main.js

// vue2
/* import Vue from 'vue'
import App from './App.vue'
new Vue({
    render:h=>h(App)
}).$mount("#app") */

// vue3
// 从Vue身上导入createApp()函数
import { createApp } from 'vue'
// 导入App组件
import App from './App.vue'
// 使用createApp()函数根据App组件创建一个Vue实例,并挂载到#app容器中
createApp(App).mount('#app')

(2) Vite

Vite中文网官方
Node.js版本 12.0以上

# 安装Vite
npm init vite@latest
# 安装依赖
npm install
# 运行
npm run dev
# 打包
npm run build

2.计算属性computed

(1) Vue3中依然可以使用Vue2中的编码方式

<div class="child">
  <h2>研究一哈计算属性</h2>
  <div>姓:<input v-model="firstName" /></div>
  <div>名:<input v-model="lastName" /></div>
  <!-- <div>姓名:{{ fullName }}</div> -->
  <div>姓名:<input v-model="fullName" /></div>
  <hr />
  <ul>
    <li v-for="item in goodses" :key="item.id">
      {{ item.name }}--{{ item.price }}
    </li>
    <li>总价:{{ totalPrice }}</li>
  </ul>
</div>
export default {
  name: "Child",
  data() {
    return {
      firstName: "张",
      lastName: "三",
      goodses: [
        { id: 1, name: "苹果", price: 5 },
        { id: 2, name: "普通", price: 8 },
        { id: 3, name: "香蕉", price: 10 },
      ],
    };
  },
  methods: {},
  computed: {
    // 计算属性,在定义的时候是函数,使用的时候是属性。
    // fullName() {
    //   console.log("fullName方法执行了");
    //   return this.firstName + "." + this.lastName;
    // },
    fullName: {
      get() {
        console.log("fullName方法执行了");
        return this.firstName + "." + this.lastName;
      },
      set(val){
          let arr = val.split('.')
          this.firstName = arr[0]
          this.lastName = arr[1]
      }
    },
    totalPrice() {
      console.log("totalPrice方法执行了");
      return this.goodses.map((r) => r.price).reduce((a, b) => a + b, 0);
    },
  },
};

(2) vue3中全新的编程方式:组合式API

computed计算属性是只读的,不能改。计算属性通常是一个方法,也可以是一个对象。在对象里面写2个方法,一个get:( )=>{ },一个set:( val )=>{ }
vue3中全新的编程方式:组合式API
导入组合式API

import { ref, reactive,computed } from "vue";
export default {
  name: "Child",
  setup() {
    // 定义姓和名
    let firstName = ref("张")
    let lastName = ref("三")
    // 定义计算属性,返回姓名
    let fullName = computed({
        // get方法返回值
        get:()=>{
            return firstName.value+'.'+lastName.value
        },
        // set方法设置值
        set:(val)=>{
            let arr = val.split('.')
            firstName.value = arr[0]
            lastName.value = arr[1]
        }
    })

    // 定义商品
    let goodses= reactive([
        { id: 1, name: "苹果", price: 5 },
        { id: 2, name: "普通", price: 8 },
        { id: 3, name: "香蕉", price: 10 },
    ]);
    // 定义计算属性,返回商品的总价
    let totalPrice = computed(()=>{
        return goodses.map((r) => r.price).reduce((a, b) => a + b, 0);
    })
  
    return {
        firstName,
        lastName,
        fullName,
        goodses,
        totalPrice
    };
  }
};

3.侦听器

(1) Vue3中依然可以使用Vue2中的编码方式

<div class="child2">
    <h2>这里是侦听器</h2>
    <div>
      薪资:{{ money }}
      <button @click="money += 100">加薪</button>
    </div>
    <div>
      学生信息:{{ student }}
      <button @click="student.name += '!'">修改姓名</button>
      <button @click="student.age += 1">修改年龄</button>
      <button @click="student.car.price += 1">修改汽车价格</button>
      <button @click="student.plane.price += 1">修改飞机价格</button>
      <button @click="student.plane.driver.name = '冰冰'">修改飞机的驾驶员</button>
    </div>
</div>

vue2的做法,数据和监听不在一起。
watch:{ 侦听者名字()}
侦听器如果是一个函数的形式,只有在侦听到数据发生变化时,才会执行。如果,要让侦听器函数在加载时,就立刻执行一次,需要改成对象的形式。
watch:{ 侦听者名字:{ handler(nval, oval) {console.log(nval, oval) } } }
immediate:true 通过设置immediate属性为true,让侦听器立刻执行一次。

<script>
export default {
  name: "Child2",
  data() {
    return {
      money: 10000,
      student:{
          name:'张三',
          age:20,
          car:{
              name:'奔驰',
              price:50
          }
      }
    };
  },
  watch: {
    // 侦听器,如果是一个函数的形式,只有在侦听到数据发生变化时,才会执行
    // 如果,要让侦听器函数,在加载时,就立刻执行一次,需要改成对象的形式
    // money(nval, oval) {
    //   console.log(nval, oval);
    // },
    money:{
        immediate:true,   // 通过设置immediate属性为true,让侦听器立刻执行一次
        handler(nval, oval){
            console.log(nval, oval);
        }
    },
    student:{
        deep:true,
        handler(nval, oval){
            // 注意:没有办法保留旧值
            console.log(nval, oval);
        }
    }
  },
};
</script>

(2) vue3中全新的编程方式:组合式API

watch函数,第一个参数:监听谁,第二个参数:回调函数,第三个参数:配置对象。
watch(
①监听者,
②(nval, oval) => {console.log(nval, oval)} ,
③{ immediate: true }
);

vue3,建议我们,监视对象时,指定监视对象的属性。
注意:第一个参数是一个函数,由该函数返回指定对象中监视的属性。
watch(
①()=>{return student.age},
②(nval,oval)=>{console.log(nval, oval)}
)

如果监视的对象属性,也是一个对象,默认不开启深度监视,需要手动开启。
watch(
①()=>{return student.car},
②(nval,oval)=>{console.log(nval,oval)},
③{deep:true}
)

<script>
// 导入组合式API
import { ref, reactive, watch,watchEffect } from "vue";
export default {
  name: "Child2",
  setup() {
    // 定义薪资
    let money = ref(10000);
    // watch函数,第一个参数:监听谁,第二个参数:回调函数,第三个参数:配置对象
    watch(
      money,
      (nval, oval) => {console.log(nval, oval)},
      { immediate: true }
    );
    // 定义学生对象
    let student = reactive({
      name: "张三",
      age: 20,
      car: {
        name: "奔驰",
        price: 50,
      },
      plane:{
        name:'东方',
        price:500,
        driver:{
          name:'彬彬',
          age:20
        }
      }
    })
    // 监视student的变化
    // 注意:监视对象默认开启深度监视,并且无法关闭。所以直接监视整个对象不好。
    // watch(
    //   student,
    //   (nval,oval)=>{console.log(nval, oval)}
    // )

    // vue3,建议我们,监视对象时,指定监视对象的属性。
    // 注意:第一个参数是一个函数,由该函数返回指定对象中监视的属性
    watch(
      ()=>{return student.age},
      (nval,oval)=>{console.log(nval, oval)}
    )

    // 如果监视的对象属性,也是一个对象,默认不开启深度监视,需要手动开启。
    watch(
      ()=>{return student.car},
      (nval,oval)=>{console.log(nval,oval)},
      {deep:true}
    )

    watch(
      ()=>{return student.plane.driver},
      (nval,oval)=>{console.log(nval,oval)},
      {deep:true}
    )

    // watchEffect()监视器,不需要明确的去监视谁,谁在回调函数里面用到了,就监视谁。
    // 注意:该回调函数一开始会执行一次。
    watchEffect(()=>{
      let m = money.value
      let n = student.name
      console.log(111);
    })

    return {
      money,
      student
    };
  },
};
</script>

相关文章

网友评论

    本文标题:(VUE3) 二、脚手架(vue-cli和vite & 计算属性

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