Vue3全家桶(学习笔记)

本文介绍了Vue3的基本语法,包括HelloWorld示例、数据驱动的反转和隐藏、TodoList、组件概念、生命周期函数、模板语法、数据与方法处理、组件复用、样式绑定、条件渲染、事件绑定以及组件的定义和使用。
摘要由CSDN通过智能技术生成

Vue3(未更完)

1.vue语法初探

1.1 HelloWord

    <body>
    <div id="root"></div>
    <script>
    // 从面向dom编程到面向数据编程
    Vue.createApp({
    data(){
    return {
    content: 1
    }
    },
    // 当页面加载完成,会自动调用mounted
    mounted() {
    setInterval( ()=>{
    this.content++
    },1000)
    },
    template: `<div>{{content}}</div>`
    }).mount('#root')
    </script> 
    </body>

这里要引用<script src="https://unpkg.com/vue@next"></script>

要慢慢将思维由面向dom到面向数据

1.2 反转和隐藏

    <div id="root"></div>
    <script>
    // 从面向dom编程到面向数据编程
    Vue.createApp({
    data(){
    return {
    content: 'helloworld'
    }
    },
    methods:{
    handClick(){
    this.content  = this.content.split('').reverse().join('')
    }
    },
    // 绑定反转函数,实习写在methods里面
    template: `
    <div>{{content}}</div>
    <button @click = "handClick">反转</button>
    ` 
    }).mount('#root')
    </script> 
	</body>	
    <body>
    <div id="root"></div>
    <script>
    // 从面向dom编程到面向数据编程
    Vue.createApp({
    data(){
    return {
    show: true
    }
    },
    methods:{
    handClick(){
    // 面向数据编程,改变数据的值
    this.show = !this.show
    }
    },
    template: `
    <span v-if = "show">hello</span>
    <button @click = "handClick">隐藏/出现</button>
    ` 
    }).mount('#root')
    </script> 
    </body>

1.3 todolist

    <body>
    <div id="root"></div>
    <script>
    // 从面向dom编程到面向数据编程
    Vue.createApp({
    data(){
    return {
    list: [],
    inputValue: ''
    }
    },
    methods:{
    handClick(){
    this.list.push(this.inputValue)
        inputValue = ''
    }
    },
    template: `
    <input v-model = "inputValue">
    <button @click = "handClick">增加</button>
    <ul>
    <li v-for = "(item,index) of list">{{item}} {{index}}</li>
    </ul>
    ` 
    }).mount('#root')
    </script> 
    </body>

index ,是item遍历的索引

<button @click = "handClick" title = "222">增加</button>

这样不对,如果title要和数据绑定,需要使用v-bind指令 :title=

1,4 组件概念初探

如果.mount('#root')挂载了组件之后再去qpp.component()去创建组件就来不及了

展示组件:定义完组件之后再去挂载app.mount('#root')

    <div id="root"></div>
    <script>
    // 从面向dom编程到面向数据编程
    const app = Vue.createApp({
    data(){
    return {
    list: [],
    inputValue: ''
    }
    },
    methods:{
    handClick(){
    this.list.push(this.inputValue)
    }
    },
    template: `
    <input v-model = "inputValue">
    <button @click = "handClick">增加</button>
    <ul>
    <todo-item v-for = "(item, index) of list"
    :content = "item"
    :index = "index"
    ></todo-item>
    </ul>
    ` 
    });
    app.component('todo-item', {
    props: ['content', 'index'],
    template: '<div>{{content}}----{{index}}</div>'
    })
    app.mount('#root')
    </script> 
    </body>

在这里,将li标签的属性通过组件化展示出来,:index :content分别绑定两个变量, 在组件中,由props:[绑定值1,绑定值2...]去接收

2. Vue基础语法

2.1 基础概念

获取数据要用vm.$data.xxx

createApp 表示创建一个Vue应用, 存储到app变量中, 传入的参数表示,这个应用最外层的组件应该如何展示

mvvm模式, m->model 数据 v->view 视图 vm -> viewModel视图数据连接层

这也是为什么 const vm = app.mount(‘#root’) vm代表的就是Vue的根组件

2.2 生命周期函数

在某一时刻会自动执行的函数

比如之前的 mounted(){}

image-20230730205903567

image-20230730210033959

图里面的判断意思是. 如果没有template 就去root挂载的根节点去找innerHtml结构

image-20230730210226446

image-20230730210418348

image-20230730210503916

image-20230730210625949

beforeUpdate是在数据改变(页面还没有渲染时调用)

updated是在页面重新渲染完之后调用,注意二者区别!

beforeUnmount当Vue应用失效时,自动执行的函数

unmounted 当Vue应用失效时,且dom完全销毁之后,自动执行的函数

image-20230730211407402

2.3 常用模版语法

template: <div v-html = "message"</div>

避免转义

v-bind:(属性或变量) = … 与data中的数据绑定 , 不知道起什么名可以**:[data中的属性名]**

template: <div v-html = "message">{{在这里面可以写类似于Max(,)这样的js表达式}}</div> 但是如果是if(){}就不行,这是js语句,不是表达式

<div v-once>{{m}}</div> 只显示一次,当m再变化,页面渲染

v-if = 'show' show是data:{} 中的bool

v-on 点击绑定

image-20230731214451194

@[event] , 而event可以在data中 event: ‘click’ /‘ mouseenter’ 绑定其他事件

image-20230731215311197

阻止默认行为 @click.prevent = “函数名”

2.4 数据,方法,计算属性,侦听器

   methods:{
     formatString(string){
       return string.toUpperCase();
     }
   },
   template: `<div>{{formatString(message)}}</div>`
 }).mount('#root')
 <script>
   const vm = Vue.createApp({
     data(){
       return {
         message: 'hello world',
         count: 2,
         price: 5
       }
     },
     computed:{
       // 当计算属性依赖的内容发生改变,才会重新执行计算
       total(){
         // 注意计算属性别漏了this
         // return this.count * this.price; 
       }
     },
     methods:{
       formatString(string){
         return string.toUpperCase();
       },
       // 只要页面重新渲染,就会重新计算
       
         Date.now();
         // return this.count * this.price; 
       }
     },
     template: `<div>{{total}}</div>`
   }).mount('#root')
 </script> 

total()(在computed中)

/当计算属性依赖的内容发生改变,才会重新执行计算
getTotal()(在函数方法中)

只要页面重新渲染,就会重新计算

侦听器

如果想数据改变隔五秒打印一些东西,用computed肯定是不行的,这是后就需要加一个watch侦听器

<script>
  const vm = Vue.createApp({
    data(){
      return {
        message: 'hello world',
        count: 2,
        price: 5
      }
    },
    computed:{
      // 当计算属性依赖的内容发生改变,才会重新执行计算
      total(){
        // 注意计算属性别漏了this
         return this.count * this.price; 
      }
    },
    watch: {
      price(){
        setTimeout(() => {
          console.log('price changed')
        },3000)
      }
    },
    methods:{
      formatString(string){
        return string.toUpperCase();
      },
      // 只要页面重新渲染,就会重新计算
      getTotal(){
        Date.now();
        // return this.count * this.price; 
      }
    },
    template: `<div>{{total}}</div>`
  }).mount('#root')

computed 和 method 都能实现的一个功能,建议使用computed,因为有缓存, computed 和 watcher 都能实现的功能,建议使用computed,因为更加简洁. watched 也可以监听price改变,然后对页面重新与安然,但是麻烦,不如computed

异步可以在watch 里面, 但同步不如在computed里面更简洁

2.5.样式绑定语法

 <script>
   const app = Vue.createApp({
     data(){
       return{
         classString: 'red'
       }
     },
     template: `<div :class = 'classString'> hello</div>`
   })
   const vm =  app.mount('#root')

通过字符串绑定来改变style样式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LCF6CQqd-1691051902984)(…/imgs/image-20230802133154875.png)]

image-20230802135424710

添加子组件

<script>
  const app = Vue.createApp({
    data(){
      return{
        classString: 'red'
      }
    },
    template: `<div :class = 'classString'> hello
      <demo />
      </div>`
  })
  // 创建组件
  app.component('demo', {
    template: ' <div class = "green" > single </div>'
  })
  const vm =  app.mount('#root')
</script> 

如果子组件有两个div. 当把class加到父组件demo中时,可以控制显示哪个div:

image-20230802140326043

通过style的方式写样式:

image-20230802140537613

这里简写写styleObject 可读性更强

2.6 条件渲染

 <script>
   const app = Vue.createApp({
     data(){
       return{
         show : false
       }
     },
     template: `
       <div v-if = 'show'> hello</div>
       <div v-show = 'show'> hello</div>
     `
   });
   const vm =  app.mount('#root')
 </script> 

v-if 是直接在DOM上添加或者删除,而v-show值通过冬至display:none属性来控制是否显示

如果频繁改变的话还是建议使用v-show

除此之外,在vue中还可以使用if else if else逻辑

image-20230802141746575

表示如果conditionOne 是True的话就展示if,如果不是,就看conditionTwo是true的话就显示else if, 否则就展示else

2.7 列表渲染

基础

可以对list 循环,也可以对对象循环:image-20230802144335089

这里的value 代表对应的变量值, key代表firstname这些等等

index是索引, 从0开始往后一次增加

image-20230802144744201

循环的时候尽量使用key值,避免重复渲染带来的性能问题

操作数组

image-20230802144910942

实现页面的添加和删除

pop索引大的开始删,shift从小的开始删除,unshift会忘头部(索引开头)添加东西

image-20230802145058175

reverse可以变更顺序

2-直接替换数组

image-20230802145323072

操作对象

image-20230802145551010

在老版本的vue中出直接修改对象里面的内容可能会有一定的问题

image-20230802145822932

这个是实现不展示lastName,但是要注意 循环和判断不要写在一个标签上,循环的优先级会更高,如果要筛序性展示,则新创建一个div标签,来选择是否展示

为了避免每一层多一个div标签

image-20230802150211640

这列template 知识占位符,并不会影响渲染效果

2.8 事件绑定

基础

image-20230802161607518

如果要传参,且还要原生的event事件,就可以在event前面加一个$传递过去

image-20230802161831118

如果要使用多个函数,就不能只写函数名了,要加上括号

事件修饰符

stop:避免冒泡

@click.stop = "方法"

.self 只有点自己才会执行,点子标签里面的其他元素则不会执行

image-20230802162356544

.prevent组织默认行为

.capture 捕获

once 只执行一次,再点击就不会执行

@scroll.passive

按键修饰符

image-20230802162853911

exact是只按ctrl这个键再点击执行的,精确执行

双向绑定

v-model

image-20230802163233015

输入框的值变,页面渲染的值跟着改变

textarea

image-20230802163655598

checkbox:image-20230802163733528

false跟着点击 变成true再变回来

image-20230802171339552

image-20230802163853755

自定义值取代false True

多个checkbox会往数组里面存Value

image-20230802164001558

radio

是单选,不能都放到数组中

image-20230802163946958

初始值要变成字符串,选谁变成谁

image-20230802164057819

select

image-20230802164357563

image-20230802164204475

加上multiple变成多选

image-20230802164631503

image-20230802164650502

image-20230802164838310

最终存储会将value里面的对象作为存储的值

帮助我吗做项目临时转化

表单中双向绑定的使用

lazy

image-20230802171443748

当失去焦点的时候渲染页面展示的值,跟v-model不一样的地方在于不实时渲染

image-20230802171603688

image-20230802171623240

输入内容的时候由String变成number

trim

image-20230802171807151

只去除字符串前后字符,中间的不会去除

3.探索组件的概念

3.1 组件的定义及复用性

image-20230803152607203

<body>
  <div id="root"></div>
  <script>
    const app = Vue.createApp({
      template: `<div><hello /><world /></div>`,
    })
    app.component('hello', {
      template: `<div>hello</div>`
    })
    app.component('world', {
    template: `<div>world</div>`
    })    

    const vm =  app.mount('#root')
  </script> 
</body>

组件可以被复用,但不会和其他组件共享

独享

image-20230803161654775

app.component定义的组件是全局的,不仅在父组件可以用,在其他的组件里也可以用,

就算不用组件,但仍会挂载到app上,影响性能,使用简单

3.2 局部组件

<body>
  <div id="root"></div>
  <script>

  const hello = {
    template: `<div>hello</div>`
  }
  const counter = {
   data(){
     return{
       count: 1
     }
   },
   template:   `<div @click = "count += 1">{{count}}</div>`
 }
    const app = Vue.createApp({
      components: {'counter': counter,
                  'hello':hello
                   },  // counter ES6
      template: `<div><counter /><hello /></div>`,
    })

    const vm = app.mount('#root')

  </script> 
</body>

全局组件建议小写字母单词,中间横线连接

一般将局部组件首字母大写,驼峰命名法: HelloWorld;

image-20230803163246287

可以略写X部分,系统会自动映射,只把组件名写上去也可以

局部组件:定义了.要注册之后才能使用,性能比较高,使用起来有些麻烦

局部组件使用时,要做一个名字和组件间的映射印象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落雨既然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值