Vue 学习-基础

1 声明式渲染

能在改变时触发更新的状态被称作是响应式的。我们可以使用 Vue 的 reactive() API 来声明响应式状态。reactive() 只适用于对象 (包括数组和内置类型,如 Map 和 Set)。而另一个 API ref() 则可以接受任何值类型。ref 会返回一个包裹对象,并在 .value 属性下暴露内部值。
例:

<script setup>
import { ref } from 'vue'const t = ref("")
t.value = hello
</script><template><h1>{{t}}</h1>
</template>

2 Attribute 绑定

在 Vue 中,mustache 语法 (即双大括号) 只能用于文本插值。为了给 attribute 绑定一个动态值,需要使用 v-bind 指令,例:

<div v-bind:id="dynamicId"></div>

但是v-bind可以省略:

<div :id="dynamicId"></div>

例,将一个class动态绑定到一个h1:

<script setup>
import { ref } from 'vue'const titleClass = ref('title')
</script><template><h1 :class="titleClass">Make me red</h1> <!-- 此处添加一个动态 class 绑定 -->
</template><style>
.title {color: red;
}
</style>

3 事件监听

可以通过v-on监听事件:

<button v-on:click="increment">{{ count }}</button>
<!-- v-on也可以简略-->
<button @click="increment">{{ count }}</button>

例,监听按钮的点击事件:

<script setup>
import { ref } from 'vue'const count = ref(0)
function add(){count.value++
}
</script><template><!-- 可以声明为函数--><button @click="add">Count is: {{ count }}</button><!-- 也可以直接声明可执行表达式--><button @click="count++">Count is: {{ count }}</button>
</template>

4 表单绑定

在处理页面和变量双向绑定有两种方式:
方式一,使用v-bind 和 v-on:
例:

<script setup>
import { ref } from 'vue'const text = ref('')
function onInput(e) {text.value = e.target.value
}
</script><template><input :value="text" @input="onInput" placeholder="Type here"><p>{{ text }}</p>
</template>

方法二,使用v-model
例:

<script setup>
import { ref } from 'vue'const text = ref('')
</script><template><input v-model="text" placeholder="Type here"><p>{{ text }}</p>
</template>

5 条件渲染

我们可以使用 v-if 指令来有条件地渲染元素,当v-if的值为true时,元素才会被渲染。
例:

<script setup>
import { ref } from 'vue'const awesome = ref(true)
</script><template><button @click="awesome = !awesome">Toggle</button><h1 v-if="awesome">Vue is awesome!</h1><h1 v-else>Oh no 😢</h1>
</template>

6 列表渲染

我们可以使用 v-for 指令来渲染一个基于源数组的列表:


<ul><li v-for="todo in todos" :key="todo.id">{{ todo.text }}</li>
</ul>

这里的 todo 是一个局部变量,表示当前正在迭代的数组元素。它只能在 v-for 所绑定的元素上或是其内部访问,就像函数的作用域一样。
注意,我们还给每个 todo 对象设置了唯一的 id,并且将它作为特殊的 key attribute 绑定到每个

  • 。key 使得 Vue 能够精确的移动每个
  • ,以匹配对应的对象在数组中的位置。
    例,实现列表元素的增删:
  • <script setup>
    import { ref } from 'vue'// 给每个 todo 对象一个唯一的 id
    let id = 0const newTodo = ref('')
    const todos = ref([{ id: id++, text: 'Learn HTML' },{ id: id++, text: 'Learn JavaScript' },{ id: id++, text: 'Learn Vue' }
    ])function addTodo() {todos.value.push({id:id++,text:newTodo.value})
    }function removeTodo(todo) {todos.value = todos.value.filter(s=>s.id !== todo.id)
    }
    </script><template><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>
    </template>
    

    7 计算属性

    API computed(),它可以让我们创建一个计算属性 ref,这个 ref 会动态地根据其他响应式数据源来计算其 .value:
    例,通过按钮来隐藏所有被删除的列表元素:

    <script setup>
    import { ref,computed  } from 'vue'let id = 0const newTodo = ref('')
    const hideCompleted = ref(false)
    const todos = ref([{ id: id++, text: 'Learn HTML', done: true },{ id: id++, text: 'Learn JavaScript', done: true },{ id: id++, text: 'Learn Vue', done: false }
    ])function addTodo() {todos.value.push({ id: id++, text: newTodo.value, done: false })newTodo.value = ''
    }function removeTodo(todo) {todos.value = todos.value.filter((t) => t !== todo)
    }const completedTodos = computed(()=>{if(hideCompleted.value){return todos.value.filter((t) => !t.done)}else{return todos.value}
    })</script><template><form @submit.prevent="addTodo"><input v-model="newTodo" required placeholder="new todo"><button>Add Todo</button></form><ul><li v-for="todo in completedTodos" :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>
    </template><style>
    .done {text-decoration: line-through;
    }
    </style>
    

    8 生命周期和模板引用

    需要手动操作 DOM时,可以通过ref attribute来实现。
    可以通过onMounted()等生命周期钩子函数来在指定生命周期执行目标代码。
    例,在onMounted()修改<p>的值:

    <script setup>
    import { ref,onMounted  } from 'vue'const pElementRef = ref(null)
    onMounted(()=>{pElementRef.value.textContent = "hhhh"
    })
    </script><template><p ref="pElementRef">Hello</p>
    </template>
    

    9 监听器

    watch() 可以直接侦听一个 ref,并且只要这个ref的值改变就会触发回调。
    例,当点击按钮式显示新的todo内容:

    <script setup>
    import { ref,watch } from 'vue'const todoId = ref(1)
    const todoData = ref(null)async function fetchData() {todoData.value = nullconst res = await fetch(`https://jsonplaceholder.typicode.com/todos/${todoId.value}`)todoData.value = await res.json()
    }fetchData()watch(todoId,(newTodoId)=>{fetchData()
    })
    </script><template><p>Todo id: {{ todoId }}</p><button @click="todoId++" :disabled="!todoData">Fetch next todo</button><p v-if="!todoData">Loading...</p><pre v-else>{{ todoData }}</pre>
    </template>
    

    10 组件

    一个vue的应用会使用到多个组件,可以通过 import 的方式引用其他组件。
    例,在App.vue中使用ChildComp.vue组件:

    ChildComp.vue:

    <template><h2>A Child Component!</h2>
    </template>
    

    App.vue:

    <script setup>
    import Child from "./ChildComp.vue"
    </script><template><Child/>
    </template>
    

    11 Props

    在子组件中,可能会用到父组件中的变量。在父组件中可以像声明一个attribute一样,向子组件动态传值。子组件需要使用defineProps,生命需要使用父组件的变量。
    ChildComp.vue:

    <script setup>
    const props = defineProps({msg: String
    })
    </script><template><h2>{{ msg || 'No props passed yet' }}</h2>
    </template>
    

    App.vue:

    <script setup>
    import { ref } from 'vue'
    import ChildComp from './ChildComp.vue'const greeting = ref('Hello from parent')
    </script><template><ChildComp :msg = "greeting"/>
    </template>
    

    12 Emits

    除了属性,子组件也会使用到父组件中的事件。子组件需要使用defineEmits声明需要用到的事件,使用emit()调用事件。emit() 的第一个参数是事件的名称,其他所有参数都将传递给事件监听器。父组件可以使用 v-on 监听子组件触发的事件.
    ChildComp.vue:

    <script setup>
    const emit = defineEmits(['response'])emit('response', 'hello from child')
    </script><template><h2>Child component</h2>
    </template>
    

    App.vue:
    一、在v-on中声明函数名

    <script setup>
    import { ref } from 'vue'
    import ChildComp from './ChildComp.vue'const childMsg = ref('No child msg yet')function fuc(msg){childMsg.value = msg
    }
    </script><template><ChildComp @response="fuc"/><p>{{ childMsg }}</p>
    </template>
    

    二、直接在v-on中声明函数过程

    <script setup>
    import { ref } from 'vue'
    import ChildComp from './ChildComp.vue'const childMsg = ref('No child msg yet')
    </script><template><ChildComp @response="(msg)=>{childMsg = msg}"/><p>{{ childMsg }}</p>
    </template>
    

    13 插槽

    父组件还可以通过插槽 (slots) 将模板片段传递给子组件。子组件只需要使用<slot>即可获取到父组件传输子组件的代码片段。
    例:
    ChildComp.vue:

    <template>
    <!--如果父组件没有传递任何内容,则会显示默认内容:Fallback content--><slot>Fallback content</slot>
    </template>
    

    App.vue:

    <script setup>
    import { ref } from 'vue'
    import ChildComp from './ChildComp.vue'const msg = ref('from parent')
    </script><template><ChildComp>{{msg}}</ChildComp>
    </template>
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/64104.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

24. 生成器

一、什么是生成器 利用迭代器&#xff0c;我们可以每次迭代获取数据&#xff08;通过 next() 方法&#xff09;时按照特定的规律进行生成。但是在实现一个迭代器时&#xff0c;关于当前迭代的状态需要我们自己记录&#xff0c;进而才能根据当前状态生成下一个数据。为了达到记录…

软件测试等级说明

Level 0 (冒烟测试-Smoke Test)&#xff1a;位于最顶部&#xff0c;是所有测试的基础&#xff0c;用来快速验证新构建是否稳定。Level 1 (基本功能测试)&#xff1a;在冒烟测试之下&#xff0c;它比冒烟测试更深入&#xff0c;确保主要功能按预期工作。Level 2 (集成测试)&…

【Hadoop】-- hadoop3.x default port

Hadoop 3.x 修改了一些以前常用的默认端口,完整的默认端口列表,可点击下面配置文件获取信息: core-default.xmlhdfs-default.xmlhdfs-rbf-default.xmlyarn-default.xml

【go语言】regexp包,正则表达式

Go语言 regexp 包详解 Go 语言的 regexp 包提供了对正则表达式的支持。 正则表达式&#xff08;regex&#xff09;是一种字符串搜索模式&#xff0c;用来检查一个字符串是否符合某种特定的模式&#xff0c;或从中提取符合某种模式的子字符串。 1. regexp 包概述 regexp 包支…

【数字花园】个人知识库网站搭建:①netlify免费搭建数字花园

目录 [[数字花园]]的构建原理包括三个步骤&#xff1a;五个部署方案教程相关教程使用的平台 步骤信息管理 这里记录的自己搭建数字花园&#xff08;在线个人知识库&#xff09;的经历&#xff0c;首先尝试的是网上普遍使用的方法&#xff0c;也就是本篇文章介绍的。 后面会继续…

《探秘开源气味数据库:数字世界里的“气味宝藏”》

《探秘开源气味数据库&#xff1a;数字世界里的“气味宝藏”》 一、开源气味数据库的兴起背景&#xff08;一&#xff09;技术发展的推动&#xff08;二&#xff09;市场需求的催生 二、常见的开源气味数据库介绍&#xff08;一&#xff09;GS-LF 香精香料数据库&#xff08;二…

【0x000C】HCI_Link_Key_Request_Negative_Reply 命令详解

目录 一、命令概述 二、命令格式及参数说明 2.1. HCI_Link_Key_Request_Negative_Reply命令格式 2.2. BD_ADDR 三、返回事件及参数 3.1. 生成的事件 3.2. BD_ADDR 2.3. Status 四、命令执行流程场景 4.1. 命令触发条件 4.2. 命令组装与发送 4.3. 控制器接收与处理 …

C#里怎么样删除字典里多项元素?

当我们使用字典比较多的情况,一般来说,就是为了提高查询的速度。 比如一个服务器,有多个TCP连接上来,每次要通过IP地址来访问这些连接对象, 就需要查找。 如果采用列表来保存,就只能遍历来查询到连接对象。 如果采用字典,就可以快速地通过字典键来查询到对象,其实这…

数字产业化和产业数字化到底是什么?

“数字产业化”和“产业数字化”在很多官方文件和领导人讲话中都是成对出现的&#xff0c;这两个术语看起来非常相似&#xff0c;但它们作为数字经济的两个重要组成部分&#xff0c;既有联系又有区别。 在谈数字产业化和产业数字化之前&#xff0c;我这里需要先给大家介绍一个概…

mysql、postgresql、oceanbase调优

一、mysql 1、my.cnf [mysqld_safe] log-error=/data/mysql/log/mysql.log pid-file=/data/mysql/run/mysqld.pid[client] socket=/data/mysql/run/mysql.sock default-character-set=utf8[mysqld] basedir=/usr/local/mysql tmpdir=/data/mysql/tmp datadir=/data/mysql/dat…

npm或yarn包配置地址源

三种方法 1.配置.npmrc 文件 在更目录新增.npmrc文件 然后写入需要访问的包的地址 2.直接yarn.lock文件里面修改地址 简单粗暴 3.yarn install 的时候添加参数 设置包的仓库地址 yarn config set registry https://registry.yarnpkg.com 安装&#xff1a;yarn install 注意…

文件上传之黑名单检测

一般情况下&#xff0c;代码文件里会有一个数组或者列表&#xff0c;该数组或者列表里会包含一些非法的字符或者字符串&#xff0c;当数据包中含有符合该列表的字符串时&#xff0c;即认定该数据包是非法的。 ​​ 一.如何判断是否为黑名单检测 黑名单是有限的&#xff0c;可以…

扩展tinyplay使其自适应不同声道数量的媒体

android原来的tinyplay代码&#xff0c;如果遇到播放媒体的 声道数量与打开pcm的声道数量不匹配的情况&#xff0c;会没法继续播放。 本例扩展了tinyplay的代码&#xff0c;将不同声道的音频数据展开/压缩到pcm设备支持的数据&#xff0c;再写入pcm设备。 bplay.c #include &…

光控资本:锂电排产上行 AI手机有望快速渗透

AI手机有望快速渗透 据赛迪参谋猜想&#xff0c;2024年AI手机的出货量估量将会抵达1.5亿部&#xff0c;占全球智能手机总出货量13%&#xff0c;到2027年&#xff0c;全球AI手机销售量有望跨过5.9亿部&#xff0c;占全球智能手机总出货量的比重跨过50%。 跟着硬件根底夯实、端侧…

el-table 动态计算合并行

原始表格及代码 <el-table:data"tableData"class"myTable"header-row-class-name"tableHead" ><el-table-column prop"date" label"日期"> </el-table-column><el-table-column prop"name" …

druid.properties图标是齿轮

一、问题 在IDEA中&#xff0c; druid.properties图标是齿轮 二、原因 2023版本开始&#xff0c;IDEA新的UI的问题 三、解决方法 1、点击右上角的齿轮图标 2、点击Settings 3、Appearance & Behavior---->New UI---->取消勾选“Enable new UI”---->右下角OK 4…

龙海家园地面停车场探寻2

在南山前海上班2年多了&#xff0c;到现在最喜欢的小区还是龙海家园小区。龙海家园小区是深圳目前最大的公共保障性租赁住房小区,目前居住有约2.6万人。而小区的停车位是远远不够的。之前一直很好奇车子可以停哪里。 后面加班之余经常去小区吃饭和转转。发现龙海家园小区与对面…

群控系统服务端开发模式-应用开发-操作记录功能开发

一、开放路由 在根目录下route文件夹下修改app.php文件&#xff0c;代码如下&#xff1a; // 操作日志Route::get(token/get_list,permission.Token/getList);// 获取操作日志列表Route::post(token/get_all,permission.Token/getAll);// 获取操作日志所有数据Route::post(toke…

SQLite Update 语句

SQLite Update 语句 SQLite 的 UPDATE 语句用于更新数据库表中的现有记录。使用 UPDATE 语句&#xff0c;您可以修改一个或多个列的值。本教程将详细介绍如何使用 SQLite UPDATE 语句&#xff0c;包括语法、示例以及一些最佳实践。 语法 SQLite UPDATE 语句的基本语法如下&a…

SQL 单表查询练习题(一)

在 SQL 的学习过程中&#xff0c;单表查询是非常重要的基础部分&#xff0c;下面为大家分享一些单表查询的练习题以及对应的正确答案&#xff0c;希望能帮助大家更好地掌握相关知识。 一、题目及答案详情 1. 查询课程表中&#xff0c;没有前序课程的课程信息&#xff0c;查询…