Vue学习日记(一)

Vue

预热:
在这里插入图片描述
执行:npm install vue@2.6.10命令安装 vue模块

<script src="./node_modules/vue/dist/vue.js"></script>

一、入门基础操作
1.模板数据绑定渲染
可生成动态的HTML页面,页面中使用嵌入 Vue.js 语法可动态生成

  1. {{xxxx}} 双大括号文本绑定
  2. v-xxxx 以 v- 开头用于标签属性绑定,称为指令

1.1 双大括号语法 {{ }}
格式:{{表达式}}
作用:

  • 使用在标签体中,用于获取数据
  • 可以使用 JavaScript 表达式

1.2 输出HTML指令 v-html
格式: v-html=‘xxxx’
作用:输出真正的 HTML

<body>
    <div id="app">
        <h3>1、双大括号输出文本内容</h3>
        <!--文本内容-->
        <p>普通文本:{{ message }}</p>
        <!--使用JS表达式-->
        <p>JS表达式:{{ number + 1 }}</p>

        <h3>3、v-html 指令输出真正的 HTML 内容</h3>
        <p>双大括号:{{ contentHtml }}</p>
        <!-- 指令的值不需要使用双大括号获取,直接写获取的属性名 -->
        <!-- <p>v-html指令:<span v-html="{{contentHtml}}"></span></p>-->
        <p>v-html指令:<span v-html="contentHtml"></span></p>
    </div>
    <script src="./node_modules/vue/dist/vue.js"></script>
    <script type="text/javascript">
        var vm = new Vue({
            el: '#app',
            data: { 
                message: 'haha',
                 number: 1, 
                 contentHtml: '<span style="color:red">红色字体内容> <script>alert("hello vue")<\/script></span>' 
                }
        }) 
    </script>
</body>

1.3 元素绑定指令 v-bind
完整格式: v-bind:元素的属性名=‘xxxx’
缩写格式: :元素的属性名=‘xxxx’
作用:将数据动态绑定到指定的元素上

1.4 事件绑定指令 v-on
完整格式: v-on:事件名称=“事件处理函数名”
缩写格式: @事件名称=“事件处理函数名” 注意: @ 后面没有冒号
作用:用于监听 DOM 事件

<body>
    <div id="app">
        <h3>4、v-bind 属性绑定指令</h3> <!-- 红色字体是正常的 -->
        <img v-bind:src="imgUrl" alt="VueLogo">
        <!-- 缩写 -->
        <img :src="imgUrl" alt="VueLogo">

        <h3>5、v-on 事件绑定指令</h3> 
        <input type="text" v-model="num">
        <button v-on:click="add">点击+1</button>
        <button @click="add">点击+1</button>
    </div>
    <script src="./node_modules/vue/dist/vue.js"></script>
    <script type="text/javascript">
        var vm = new Vue({
            el: '#app',
            data: {
                message: 'haha',
                number: 1,
                contentHtml: '<span style="color:red">红色字体内容> <script>alert("hello vue")<\/script></span>',
                imgUrl: 'https://cn.vuejs.org/images/logo.png',
                num:0
            },
            methods: { //指定事件处理方法, 在模板页面中通过 v-on:事件名 来调用 
                add: function () { //key为方法名 
                    console.log('add被调用') 
                    // this 表示当前 vm 实例 
                    this.num++ //每点击1次num加1 
            }
         }
        }) 
    </script>
</body>

1.5 计算属性 computed
computed 选项定义计算属性
计算属性 类似于 methods 选项中定义的函数

  • 计算属性 会进行缓存,只在相关响应式依赖发生改变时它们才会重新求值。
  • 函数 每次都会执行函数体进行计算。
  • 计算属性默认只有 getter ,不过在需要时你也可以提供一个 setter

1.6 监听器 watch
当属性数据发生变化时,对应属性的回调函数会自动调用, 在函数内部进行计算
通过 watch 选项 或者 vm 实例的 $watch() 来监听指定的属性

<body>
    <div id="app">
        数学:<input type="text" v-model="mathScore"><br> 
        英语:<input type="text" v-model="englishScore"><br>
        总分(方法-单向):<input type="text" v-model="sumScore()"><br> 
        总分(计算属性-单向):<input type="text" v-model="sumScore1"><br>
        总分(计算属性-双向):<input type="text" v-model="sumScore2"><br> 
        总分(监听器):<input type="text" v-model="sumScore3"><br>
    </div>
    <script src="./node_modules/vue/dist/vue.js"></script>
    <script type="text/javascript">
        var vm = new Vue({
            el: '#app',
            data: {
                mathScore: 80,
                englishScore: 90,
                sumScore3: 170
            },
            methods: {
                //不要少了s 
                sumScore: function () {
                    //在控制台输入 vm.sumScore() 每次都会被调用 
                    console.info('sumScore被调用')
                    // `this` 指向当前 vm 实例, 减 0 是为了字符串转为数字运算 
                    return (this.mathScore - 0) + (this.englishScore - 0)
                }
            },
            computed: {
                //计算属性 
                sumScore1: function () {
                    //在控制台输入vm.sumScore1 不会被重新调用,说明计算属性有缓存 
                    console.info('sumScore1被调用')
                    return (this.mathScore - 0) + (this.englishScore - 0)
                },
                //指定 getter/setter 双向绑定 
                sumScore2: {
                    get: function () {
                        console.info('sumScore2被调用')
                        return (this.mathScore - 0) + (this.englishScore - 0)
                    },
                    set: function (newValue) {
                        //value为更新后的值 
                        // 被调用则更新了sumScore2,然后将数学和英语更新为平均分 
                        var avgScore = newValue / 2
                        this.mathScore = avgScore
                        this.englishScore = avgScore
                    }
                },   
            },
            //监听器方式1:watch选项
            watch : {
                    //当数学修改后,更新总分sumScore3 
                    mathScore : function (newValue, oldValue) { 
                    //newValue 就是新输入的数学得分
                    this.sumScore3 = (newValue-0) + (this.englishScore-0)
                    } 
                }
        }) 
        
        //监听器方式2:通过vm对象调用 
        //第1个参数为监听的属性名,第2个回调函数 
        vm.$watch('englishScore', function (newValue) { //newValue 就是新输入的英语得分 
            this.sumScore3 = (newValue-0) + (this.mathScore-0) 
        })
        </script>
</body>

1.7 Class 与 Style 绑定 v-bind
v-bind:class=‘表达式’ 或 :class=‘表达式’
class 的表达式可以为:

  • 字符串 :class=“activeClass”
  • 对象 :class="{active: isActive, error: hasError}"
  • 数组 :class="[‘active’, ‘error’]" 注意要加上单引号,不然是获取data中的值

v-bind:style=‘表达式’ 或 :style=‘表达式’
style 的表达式一般为对象

  • :style="{color: activeColor, fontSize: fontSize + ‘px’}"
  • 注意:对象中的value值 activeColor 和 fontSize 是data中的属性
<body>
    <!-- 第2步:定义样式 -->
    <style>
        .active {
            color: green;
        }

        .delete {
            background: red;
        }

        .error {
            font-size: 30px;
        }
    </style>

    <div id="app">
        <h2>Class绑定,v-bind:class 或 :class</h2>
        <!--activeClass会从data中获取值为active,则对应样式为绿色-->
        <p v-bind:class="activeClass">字符串达式</p> 
        <!-- isDelete为 true,渲染delete样式;当 hasError为false,不取 error 样式;-->
        <p :class="{delete: isDelete, error: hasError}">对象表达式</p>
        <!--- 渲染 'active', 'error' 样式,注意要加上单引号,不然是获取data中的值 -->
        <p :class="['active', 'error']">数组表达式</p>
        <h2>Style绑定, v-bind:style 或 :style</h2>
        <p :style="{color: activeColor, fontSize: fontSize + 'px'}">Style绑定</p>
    </div>

    <script src="./node_modules/vue/dist/vue.js"></script>
    <script type="text/javascript"> 
    new Vue({
            el: '#app', 
            data: {
                activeClass: 'active', 
                isDelete: true, 
                hasError: false, //演示 Style 绑定 
                activeColor: 'red', 
                fontSize: 20
            }
        }) 
    </script>
</body>

1.8 条件渲染 v-if

  • v-if 是否渲染当前元素
  • v-else
  • v-else-if
  • v-show 与 v-if 类似,只是元素始终会被渲染并保留在 DOM 中,只是简单切换元素的 CSS 属性 display 来显示或隐藏
<body>
    <style>
        .box {
            width: 200px;
            height: 200px;
            background: red;
        }
    </style>
    <div id="app">
        <h2>v-if 条件渲染</h2>
        <input v-model="seen" type="checkbox">勾选后显示红色小块
        <!-- v-if 为 true则显示渲染当前元素, -->
        <div v-if="seen" class="box"></div>
        <p v-else="seen">红块已隐藏</p>
        <h2>v-show 条件渲染</h2>
        <!-- v-show 的元素始终会被渲染并保留在 DOM 中,只是简单切换元素的 CSS 属性 display 显示隐藏,而不是重新加载div-->
        <div v-show="seen" class="box"></div>
    </div>
    <script src="./node_modules/vue/dist/vue.js"></script>
    <script type="text/javascript"> 
    var vm = new Vue({ 
        el: '#app', 
        data: { seen: false }
     })
    </script>
</body>

1.9 列表渲染 v-for
1.v-for 迭代数组
语法: v-for="(alias, index) in array"
说明: alias : 数组元素迭代的别名; index : 数组索引值从0开始(可选) 。
2. v-for 迭代对象的属性
语法: v-for="(value, key, index) in Object"
说明: value : 每个对象的属性值; key : 属性名(可选); index : 索引值(可选) 。

<body>
    <div id="app">
        <h2>1. 迭代数组</h2>
        <ul>
            <!-- e 为当前对象别名,index 数组下标0开始-->
            <!-- 使用 `key` 特殊属性, 它会基于 key 的变化重新排列元素顺序,并且会移除 key 不存在的元素 -->
            <li v-for="(e, index) in emps" :key="index"> 
                编号:{{index+1}},姓名:{{e.name}},工资:{{e.salary}} </li>
        </ul> <br>
        <h2>2. 迭代对象</h2>
        <ul>
            <!-- value是属性值,key是属性名,index索引值-->
            <li v-for="(value, key, index) in emps[0]"> 
                第{{index+1}}个属性为:{{key}} = {{value}}
            </li>
        </ul>
    </div>
    <script src="./node_modules/vue/dist/vue.js"></script>
    <script type="text/javascript"> 
        var vm = new Vue({ 
            el: '#app', 
            data: { 
                emps: [ //数组 
                {name: '马云', salary: '20000'},
                {name: '马化腾', salary: '18000'},
                {name: '刘强东', salary: '13000'} 
            ] } 
        }) 
        </script>
</body>

1.10 事件处理
1.事件处理方法
完整格式: v-on:事件名=“函数名” 或 v-on:事件名=“函数名(参数……)”
缩写格式: @事件名=“函数名” 或 @事件名=“函数名(参数……)” 注意: @ 后面没有冒号 @blur(失焦)

  • event :函数中的默认形参,代表原生 DOM 事件
  • 当调用的函数,有多个参数传入时,需要使用原生DOM事件,则通过 $event 作为实参传入
    作用:用于监听 DOM 事件

2.事件修饰符
事件修饰符

  • .stop 阻止单击事件继续传播 event.stopPropagation()
  • .prevent 阻止事件默认行为 event.preventDefault()
  • .once 点击事件将只会触发一次

3.按键修饰符
格式: v-on:keyup.按键名 或 @keyup.按键名
常用按键名:
.enter .tab .delete (捕获“删除”和“退格”键) .esc .space .up .down .left .right

<body>
    <div id="app">
        <h2>1. 事件处理方法</h2>
        <button v-on:click="say">Say {{msg}}</button>
        <button @click="warn('hello', $event)">Warn</button> <br>
        <h2>2. 事件修饰符</h2>
        单击事件继续传播
        <div @click="todo">
            <!--点击后会调用doThis再调用todo-->
            <button @click="doThis">单击事件会继续传播</button>
        </div> <br/>
        <!-- 阻止单击事件继续传播,-->
        <div @click="todo">
            <!--点击后只调用doThis-->
            <button @click.stop="doThis">阻止单击事件会继续传播</button>
        </div> <br>
        <!-- 阻止事件默认行为 -->
        <a href="http://www.mengxuegu.com" @click.prevent="doStop">梦学谷官网</a>
        <br><br>
        <!-- 点击事件将只会触发一次 -->
        <button @click.once="doOnly">点击事件将只会触发一次: {{num}}</button>
        <h2>3. 按键修饰符</h2>
        <input @keyup.enter="keyEnter">
        <!--进入输入框按回车时调用keyEnter-->
        <input @keyup.space="keySpace">
        <!--进入输入框按空格时调用keySpace-->
    </div>
    <script src="./node_modules/vue/dist/vue.js"></script>
    <script type="text/javascript">
        var vm = new Vue({
            el: '#app',
            data: { msg: 'Hello, Vue.js', num: 1 },
            methods: {
                say: function (event) {
                    // `this` 在方法里指向当前 Vue 实例 
                    alert(this.msg)
                    // `event` 是原生 DOM 事件 
                    alert(event.target.innerHTML)
                },//多个参数如果需要使用原生事件,将 $event 作为实参传入 
                warn: function (msg, event) {
                    alert(msg + "," + event.target.tagName)
                },
                todo: function () {
                    alert("todo....");
                },
                doThis: function () {
                    alert("doThis....");
                }, 
                doStop: function () {
                    alert("href默认跳转被阻止....")
                }, 
                doOnly: function () {
                    this.num++
                }, 
                keyEnter: function () {
                    alert("已按:回车键")
                }, 
                keySpace: function () {
                    alert("已按:空格键")
                }
            }
        }) 
    </script>
</body>

1.11 表单数据双向绑定v-model

  • 单向绑定:数据变,视图变;视图变(浏览器控制台上更新html),数据不变;上面的都是单向绑定
  • 双向绑定:数据变,视图变;视图变(在输入框更新),数据变;
<body>
    <div id="demo">
        <!-- @submit.prevent 阻止事件的默认行为,当前阻止的是action行为 -->
        <form action="#" @submit.prevent="submitForm">
            姓名(文本):<input type="text" v-model="name">
            <br><br>

            性别(单选按钮):
            <input name="sex" type="radio" value="1" v-model="sex" /><input name="sex" type="radio" value="0" v-model="sex" /><br><br>

            技能(多选框):
            <input type="checkbox" name="skills" value="java" v-model="skills">Java开发
            <input type="checkbox" name="skills" value="vue" v-model="skills">Vue.js开发
            <input type="checkbox" name="skills" value="python" v-model="skills">Python开发
            <br><br>

            城市(下拉框):
            <select name="citys" v-model="city">
                <option v-for="c in citys" :value="c.code">
                    {{c.name}}
                </option>
            </select>
            <br><br>

            说明(多行文本):<textarea cols="30" rows="5" v-model="desc"></textarea>
            <br><br>
            <button type="submit">提交</button>
        </form>
    </div>

    <script src="./node_modules/vue/dist/vue.js"></script>
    <script>
        new Vue({
            el: '#demo',
            data: {
                name: '',
                sex: '1',   //默认选中的是 男
                skills: ['vue', 'python'], //默认选中 Vue.js开发 、Python开发
                citys: [
                    { code: 'bj', name: '北京' },
                    { code: 'sh', name: '上海' },
                    { code: 'gz', name: '广州' }
                ],
                city: 'sh', // 默认选中的城市:上海
                desc: ''
            },
            methods: {
                submitForm: function () { //处理提交表单
                    //发送ajax异步处理
                    alert(this.name + ', ' + this.sex + ', ' + this.skills + ', ' + this.city + ', ' + this.desc)
                }
            }
        })
    </script>
</body>
### 回答1: 很高兴回答你的问题。作为一个 AI 语言模型,我没有实际的经验来记录日记。但是,我可以告诉你,Vue 是一个流行的 JavaScript 框架,它可以帮助开发人员构建交互式的 Web 应用程序。Vue 具有简单易学、灵活性强、性能优异等优点,因此在开发中得到了广泛的应用。如果你有任何关于 Vue 开发的具体问题,我很乐意帮助你解答。 ### 回答2: 第一天: 今天开始了一周的vue开发。首先,我花了一些时间了解了一下vue的基本概念和语法规则。我了解到vue是一个渐进式的JavaScript框架,它可以用于构建用户界面。我通过阅读官方文档和参考一些教程来学习如何使用vue。初步了解了vue的组件化开发和数据绑定的概念。 第二天: 今天,我决定尝试一下使用vue来构建一个简单的ToDo列表应用程序。我创建了一个vue项目,并在主组件中定义了一些数据和方法。然后,我使用v-for指令来遍历数据,并使用v-bind指令实现了数据的双向绑定。我还添加了一些样式来美化界面。整个过程相对顺利,虽然在处理一些细节时遇到了一些问题,但最终成功完成了ToDo列表应用。 第三天: 今天我决定学习一下vue的路由功能。我在项目中引入了vue-router,并创建了一些路由组件。然后我定义了一些路由规则,并在主组件中使用<router-view>显示当前路由对应的组件。我还添加了一些导航链接,并用router-link指令实现了路由的切换。学习路由功能过程中遇到了一些语法和配置问题,但最终解决了。 第四天: 今天我开始学习vue的状态管理功能。我在项目中引入了vuex,并创建了一些状态和mutations。然后我在主组件中使用mapState和mapMutations辅助函数来访问和修改状态。学习状态管理的过程中,我发现了vuex的一些特性,比如模块化和插件化,并尝试使用这些特性来简化代码结构。 第五天: 今天我专注于学习vue的动画功能。我在项目中引入了vue的动画模块,并尝试了一些基本的动画效果,如淡入淡出和滑动效果。我还了解到了过渡和动态组件的概念,并尝试通过vue的transition和transition-group组件实现了这些效果。学习动画功能让我的应用程序变得更加生动和有趣。 第六天: 今天我决定学习vue的性能优化技巧。我通过懒加载和按需加载等技术来优化我的应用程序的加载速度。我还使用vue-devtools工具来分析和优化组件的性能。学习性能优化的过程中,我了解到了一些常见的优化策略,如减少不必要的重新渲染和合理使用计算属性等。 第七天: 今天是我这一周的vue开发的最后一天。我回顾了一下这一周的学习和实践,发现自己在vue的开发中有了很大的进步。我对vue的基本概念和语法有了更深入的了解,也掌握了一些高级功能和优化技巧。我觉得通过这一周的实践,我对vue的开发有了更加扎实的基础,以后可以更好地应用它来构建复杂的应用程序。 ### 回答3: 第一天: 今天开始进行vue开发,首先安装了vue-cli脚手架工具,并创建了一个新的vue项目。然后我使用vue-router插件来搭建了项目的路由系统,可以通过不同的URL来实现页面的跳转。接下来,我创建了几个组件,包括Header、Footer和Home等,并在页面中引入和使用了这些组件。通过组件化的开发方式,我可以更好地管理和复用代码。 第二天: 今天我继续进行vue开发,学习vue的数据绑定和事件绑定。我在组件中创建了一些数据属性,然后在模板中使用双花括号语法将数据和页面进行绑定。并且,我还通过v-on指令绑定了一些事件处理函数,实现了一些交互功能,比如点击按钮触发弹窗等。vue的数据驱动模型让我对整个开发过程更加流畅和高效。 第三天: 今天我开始研究vue的组件通信问题。我学习了父子组件之间的通信方式,包括props和$emit方法,可以实现父组件向子组件传递数据和子组件向父组件发送事件。我还学习了兄弟组件之间的通信方式,可以使用事件总线或者vuex来实现不同组件之间的数据传递和状态管理。掌握了这些通信方式后,我能够更好地组织和管理组件之间的关系。 第四天: 今天我学习vue的生命周期钩子函数。通过对生命周期的理解,我可以在不同阶段进行一些初始化或者清理工作。其中,created和mounted是最常用的两个钩子函数,分别在实例创建之后和实例挂载到页面之后被调用。我可以在这两个钩子函数中进行一些异步数据请求或者DOM操作,确保在渲染之前或之后进行必要的操作。 第五天: 今天我开始学习vue的状态管理模式vuex。在复杂的应用中,组件之间的状态管理变得非常重要,而vuex提供了一个集中式的存储管理方案。我创建了一个vuex的store,包括state、mutations、actions和getters等。通过mutations和actions,我可以对state进行修改,并且可以通过getters获取state中的数据。vuex的使用大大简化了整个应用的状态管理流程。 第六天: 今天我继续进行vue开发,学习了异步组件和动态路由的使用。在项目中,如果有一些组件比较大或者需要懒加载,可以使用异步组件的方式按需加载。我使用了import函数和webpack的代码分割功能来实现异步组件的加载。另外,动态路由可以使得路由的配置更加灵活,可以根据需要动态添加或删除路由配置。这样我可以更好地管理和控制路由。 第七天: 今天是我进行vue开发的最后一天,我进行了项目的打包和部署。通过vue-cli提供的命令,我将项目进行了打包,生成了静态资源文件。然后,我将这些静态资源文件上传到服务器,并配置了nginx代理,使得项目可以通过域名访问。最后,我进行了一些简单的测试和优化,确保项目在生产环境下正常运行。整个vue开发流程结束,我对vue的开发有了更深入的了解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值