Vue入门(一)

基于Vue官网教程(1-9)的自学笔记,记录自己对概念的粗浅理解。

欢迎交流,如有不对请留言指正~

目录

1、单文件组件

2、选项式API

3、声明式渲染:

4、v-model

5、v-for 渲染列表/数组

6、compute计算属性

计算属性便利在哪?

7、模板引用


1、单文件组件

Vue 的单文件组件会将一个组件的逻辑 (JavaScript),模板 (HTML) 和样式 (CSS) 封装在同一个文件里。

例子:

<script setup>
import { ref } from 'vue'
const count = ref(0)
</script>

<template>
  <button @click="count++">Count is: {{ count }}</button>
</template>

<style scoped>
button {
  font-weight: bold;
}
</style>

2、选项式API

选项式 API 以“组件实例”的概念为中心 (即上述例子中的 this),对于有面向对象语言背景的用户来说,这通常与基于类的心智模型更为一致。同时,它将响应性相关的细节抽象出来,并强制按照选项来组织代码,从而对初学者而言更为友好。

3、声明式渲染:

我们可以根据 JavaScript 的状态来描述 HTML 应该是什么样子的。当状态改变时,HTML 会自动更新。

<script type="module">
import { createApp } from 'vue'

createApp({
  data() {
    return {
      message: 'Hello World!',
      counter: {
        count: 0
      }
    }
  }
}).mount('#app')
</script>

<div id="app">
  <h1>{{ message }}</h1>
  <p>Count is: {{ counter.count }}</p>
</div>

特指的是mount绑定了id为app的标签后,该标签内可以通过

双层花括号括住键值的方式获取data中定义的数据的值

2、目前的花括号只能对文本插值进行动态变换,现在还可以对标签中的属性进行动态绑定

比如对标签<div>中的属性id\属性class进行动态绑定:

<script type="module">
import { createApp } from 'vue'

createApp({
  data() {
    return {
      titleClass: 'title'
    }
  }
}).mount('#app')
</script>

<div id="app">
  <h1 :class="titleClass">Make me red</h1> <!-- 此处添加一个动态 class 绑定 -->
</div>

这里就是对h1的class进行动态绑定,class真正的值是data组件中键"titleClass"对应的值——title

3、对DOM事件的绑定

<script type="module">
import { createApp } from 'vue'

createApp({
  data() {
    return {
      count: 0
    }
  },
  methods:{
    add(){
      this.count++
    }
  }
}).mount('#app')
</script>

<div id="app">
  <!-- 使此按钮生效 -->
  <button @click="add">count is: {{ count }}</button>
</div>

对标签<button>动态绑定函数,用 @DOM=“function”

function放在createApp的methods中

4、v-model

示例:

<script>
export default {
  data() {
    return {
      picked: 'One'
    }
  }
}
</script>

<template>
	<div>Picked: {{ picked }}</div>

	<input type="radio" id="one" value="One" v-model="picked" />
	<label for="one">One</label>

	<input type="radio" id="two" value="Two" v-model="picked" />
	<label for="two">Two</label>
</template>

更改 type和v-model所指的对象picked的形式后,又可以构造:

<script>
export default {
  data() {
    return {
      picked: []
    }
  }
}
</script>

<template>
	<div>Picked: {{ picked }}</div>

	<input type="checkbox" id="one" value="One" v-model="picked" />
	<label for="one">One</label>

	<input type="checkbox" id="two" value="Two" v-model="picked" />
	<label for="two">Two</label>
</template>

5、v-for 渲染列表/数组

data() {
  return {
    parentMessage: 'Parent',
    items: [{ message: 'Foo' }, { message: 'Bar' }]
  }
}
<li v-for="(item,index) in items">
    {{parentMessage}}-{{index}}-{{item.message}}
</li>

1)注意要点 v-for="" 是一个字符串 字符串可以是"item in items"或者是"(item,index) in items“

2)可以用of替代上述in

3)先value后键值再索引【和python不太一样】

4)v-for 中可以直接 in 一个整数值 v-for="n in 10" 范围是[1,10]

不推荐同时使用v-for和v-if 二者的优先级不明确

5)为了给 Vue 一个提示,以便它可以跟踪每个节点的标识,从而重用和重新排序现有的元素,你需要为每个元素对应的块提供一个唯一的 attribute:key

<div v-for="item in items" :key="item.id">
  <!-- 内容 -->
</div>

简单应用解析 【见注释】

效果:要求输入,然后add todo的时候会增加列表项,点击其中一项的X会删除该项todo

<script type="module">
import { createApp } from 'vue'

// 给每个 todo 对象一个唯一的 id
let id = 0

createApp({
  // 数据部分——存放状态
  data() {
    return {
      newTodo: '',
      todos: [
        { id: id++, text: 'Learn HTML' },
        { id: id++, text: 'Learn JavaScript' },
        { id: id++, text: 'Learn Vue' }
      ]
    }
  },
// 方法——改变状态的方式
  methods: {
    addTodo() {
      this.todos.push({ id: id++, text: this.newTodo })
      this.newTodo = ''
    },
    removeTodo(todo) {
      this.todos = this.todos.filter((t) => t !== todo)
    }
  }
}).mount('#app')
</script>

<div id="app">
    <!-- 输入框和按钮形成一个提交的表单-->
  <form @submit.prevent="addTodo">
    <input v-model="newTodo" required placeholder="new todo">
    <button>Add Todo</button>
  </form>
   <!-- 展示的列表-->
  <ul>
    <li v-for="todo in todos" :key="todo.id">
      {{ todo.text }}
      <button @click="removeTodo(todo)">X</button>
    </li>
  </ul>
</div>

新增表项:

 1)input框用到了前文说到的"v-model",值是"newTodo",所以这个input的输入值将会被存储到newTodo中

2)button被包在form内部,而form又指定了submit.prevent="addTodo",表示点击了按钮之后就会执行addTodo的操作

3)之前提到输入框的值已经被存储到newTodo中了,所以addTodo只需要根据形式将id++,然后取newTodo的值,将包装好的对象字面量(就是{id:id++,text:this.newTodo})放大todos列表中去

4)展示部分:<li></li>标签中用到v-for遍历todos列表,每项的显示内容是todo.text,后跟随一个X按钮

<ul>
    <li v-for="todo in todos" :key="todo.id">
      {{ todo.text }}
      <button @click="removeTodo(todo)">X</button>
    </li>
  </ul>

完成1)-4)就可以实现如下效果

删除功能:

5)查找javascript数组相关的函数  网址:Array.prototype.filter() - JavaScript | MDN (mozilla.org)ilter函数,filter接受一个函数:筛选的对象=> 对象满足的要求,eg: (t)=> t!=todo

6)button X绑定删除函数

完成5)-6)可以实现如下效果

6、compute计算属性

我们可以使用 computed 选项声明一个响应式的属性,它的值由其他属性计算而来

举个实例: 

相关的部分我已经用注释划出

<script type="module">
import { createApp } from 'vue'

let id = 0

createApp({
  data() {
    return {
      newTodo: '',
      hideCompleted: false,
      todos: [
        { id: id++, text: 'Learn HTML', done: true },
        { id: id++, text: 'Learn JavaScript', done: true },
        { id: id++, text: 'Learn Vue', done: false }
      ]
    }
  },

// 这部分就是计算属性
//
  computed: {
    filteredTodos() {
      return this.hideCompleted
        ? this.todos.filter((t) => !t.done)
        : this.todos
    }
  },

// 计算属性 end--//
  methods: {
    addTodo() {
      this.todos.push({ id: id++, text: this.newTodo, done: false })
      this.newTodo = ''
    },
    removeTodo(todo) {
      this.todos = this.todos.filter((t) => t !== todo)
    }
  }
}).mount('#app')
</script>

<div id="app">
  <form @submit.prevent="addTodo">
    <input v-model="newTodo" required placeholder="new todo">
    <button>Add Todo</button>
  </form>
  <ul>
        <!--这里用到了计算属性filteredTodos-->
    <li v-for="todo in filteredTodos" :key="todo.id">
      <input type="checkbox" v-model="todo.done">
      <span :class="{ done: todo.done }">{{ todo.text }}</span>
      <button @click="removeTodo(todo)">X</button>
    </li>
  </ul>
  <button @click="hideCompleted = !hideCompleted">
    {{ hideCompleted ? 'Show all' : 'Hide completed' }}
  </button>
</div>

计算属性便利在哪?

如果没有计算属性的概念,那么我会对倒数的按钮编写一个hideCompleted函数

函数应该要做的事情有:

1、更换按钮上的文字

2、更换todos的内容(像removeTodo那样)

这里就会发现问题了,因为hideCompleted不是要改变todos的元素,只是屏蔽一些元素的出现,如果像removeTodo那样,那么this.todos就会被重新赋值,filter掉的元素找不回来,无法完成从hide到show all的转变

所以本质上的解决方法是:展示出来的元素用另一个list存储,这个list在数值上(元素上)可以完全拷贝this.todos,也可以只拷贝this.todos的部分,然后展示上的v-for就用这个额外的lsit

计算属性就是这样的思路,只不过它没有在data()中先声明出一个list,而是到需要的时候经fiteredTodos去判断、返回新创的一个list

7、模板引用

个人感觉类似JS中document.getElementById

元素用ref加个标识

在createApp中的mounted(){}进行操作挂载

<script type="module">
import { createApp } from 'vue'

createApp({
  mounted() {
    this.$refs.pElementRef.textContent = 'mounted!'
  }
}).mount('#app')
</script>

<div id="app">
  <p ref="pElementRef">hello</p>
</div>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值