vue 基础学习 第一天

引用vue

  • 可以引用来自 bootcdn的vue资源
  • 也可以直接下载下来。
  • <script src="vue.js"></script> 在.html文件中引用.js即。

1 构建第一个vue程序

  • 先上代码
<!-- 指定元素id -->
<div id="app"> 
    <h1> {{title}} </h1> <!-- 插值{{}} -->
</div>
<script>
    // 新建 app 组件
    var app = new Vue({
        el: '#app', //绑定id
        data: {
            title: '标题', //配置数据
        },
    });
</script>
  • vue 不能够挂载在 <html><body> 标签上。
  • vue 可以找到 class 和 id的元素
  • vue 使用 new Vue(传递配置信息对象) 的方式实例化
  • 配置信息中我们接触了2个属性 el: '绑定的元素', data: {传递给元素键值对数据}
  • 在页面调试的时候,我们可以使用控制台输入代码 app.title="测试" 来体验Vue动态渲染页面 注意这里不是app.data.title

2 操作元素属性

  • 要操作元素属性,必要要在 html代码 中使用 v-bind:属性="key" 来绑定属性,比如 <h1 v-bind:class="color"> ... </h1>
  • 然后在 Vue 的 js代码中 编辑key
var app = new Vue({
    el: '#app',
    data: {
        // key: value,
        color: 'red',
    },
});
  • 定义一个 css 样式 .red { color: red; }
  • 这样一来,html代码在浏览器中其实是被解析成 <h1 class="red"> ... </h1>, 即展示红色字体。
  • v-bind: 由于频繁使用,因此可以简写为 :
  • 如果我又想绑定,同时又想使用其他的样式类呢? <h1 v-bind:class="color" :class="'text-center'"> ... </h1> :class="'如果使用双引号包单引号再包字符串,则直接解析为字符串'"

3 v-model & v-once

  • 先上代码
<div id="app">
    <h1> {{ content }} </h1>
    <h2 v-once> {{ content }} </h1>
    <input type="text" v-model="content">
</div>

<script>
    var app = new Vue({
        el: '#app',
        data: {
            content: '远走',
        },
    });
</script>
  • 可以看到: h1就是普通的显示数据, h2则添加了一个v-once, input则添加了一个v-model
  • 修改 input 的值,会发现 h1 的内容会发生改变, h2 则不会,是因为 h2 的 v-once 告诉Vue,h2的内容,只从data里读一次,并不希望随着数据绑定的修改而修改
  • 修改 input 的值,h1 会随之发生改变的原因就是因为 v-model 绑定了 app.content 。而 h1 没有使用 v-once
  • 总结就是 v-model 绑定某个数据,input.value更改,该数据会随之发生变化。如果想只拿初始值,就需要使用 v-once

注意元素中的属性,不需要{{}} 。而标签中的内容,需要使用{{}}

4 v-text & v-html

  • laravel框架在视图层也使用 {{}} 来显示变量,怎么解决?
<div id="app">
    <div v-text="content"></div>
    <div v-html="content"></div>
</div>

<script>
    var app = new Vue({
        el: '#app',
        data: {
            content: '<p>v-text & v-html</p>'
        },
    });
</script>

使用 v-text 渲染绑定标签内容为纯文本, v-html 则会解析 html标签

5使用 js表达式 在标签属性或者内容里面进行运算

  • 代码
<div id="app">
    <p :class="'style'+n">test...</p>
    <p><small>这是当前的n的值</small> {{n+'因为切换颜色的单选框.value是字符串,所以我这里也变成字符串了'}} </p>
    <input type="radio" v-model="n" value="1"> 红 
    <input type="radio" v-model="n" value="2"> 蓝
</div>

<script>
    var app = new Vue({
        el: '#app',
        data: {
            n: 1,
        },
    });
</script>
  • 在内容进行运算 {{ n+1 }}
  • 在属性进行运算 :class="'style'+n" => 这里的 style 对应 .style(因为单引号包起来的),而 n 对应 app.n => js中, '字符串'+数字 = '字符串连接数字'。因此对应的样式就是 .style1 和 .style2。
  • 在我们使用 单选框 修改n的value的时候,不用给 input.name 指定值,通过 v-model 绑定的,html会自动识别他们的关系。(不会出现两个都能选中的情况)
  • 因为 value="字符串" 所以我们在内容再显示 {{ n+1 }} 的时候,就变成了 11 或者 21 (+当字符串连接运算处理了)

6 computed 计算

  • 代码
<div id="app">
    <input type="text" v-model="num1"> +
    <input type="text" v-model="num2"> =
    <input type="text" v-model="sum">
</div>

<script>
    var app = new Vue({
        el: '#app',
        computed: {
            sum: function() {
                return this.num1*1 + this.num2*1;
            }
        },
        data: {
            num1: 0,
            num2: 0,  
        },
    });
</script>
  • 定义计算属性 computed computed: { 虚拟属性: function() { //执行运算的代码 } }
  • 上面提到过,访问 data 里定义的数据应该是直接用 app.key 而不是 app.data.key ,在组件定义的内部也一样,使用 this.key 访问 data 下定义的值
  • v-model="sum" 即绑定了 computed 中的 虚拟属性'sum' (因为这个sum其实不存在于内存中)
  • js中想要 + 处理为 加法运算, 而 + 两边又是 字符串的时候,给字符串做一次乘法运算。
  • sum: function() { //... } 可以简写为 sum() { //... }

7 watch 监听某个 data 的变化

  • 先用 cnpm 装一个 插件 cnpm install axios ,并在页面上引用 <script src="node_modules/axios/dist/axios.min.js"></script>
  • 代码
<div id="app">
    <input type="text" v-model="keyWord">
    {{ content }}
</div>

<script>
    var app = new Vue({
        el: '#app',
        watch: {
            keyWord: function(newWord, oldWord) {
                // 将新值作为数据参数 $_GET['word'] 请求 7.php 
                axios.get('./7.php?word=' + newWord).then(function(response) {
                    app.content = response.data;
                });
            }
        },
        data: {
            keyWord: '',
            content: '',
        },
    });
</script>
  • 监听的使用 watch: { 监听的data: function(第一个参数是旧值, 第二个参数是新值) { //值发生变化后触发函数执行的代码 } }
  • 使用 axios.get(url) 方式请求我们创建的 7.php <?php echo '测试 test...' . $_GET['word'];
  • 使用 axios.then() 内部使用回调函数处理逻辑,修改我们的 app.content ,这里不能用 this.content
  • 最终实现了一个: 监听 app.keyWord 值的变化,发生变化时异步请求(通过 axios 实现)请求后台php程序,然后修改了前台的app.content的值的功能:(百度搜索,输入关键字,显示可以热门搜索列表的功能),只是我们没有在php程序中去访问和检索数据库罢了。

通常来说502是后台有问题(php) 404是前台有问题(没找到url,地址写错了)

  • 优化: 监听 keyWord 的变化时,,每变化一次,我们都去请求了一次 7.php ,相当消耗资源,所以我们装一个 lodash cnpm install lodash , 在页面引用它并且使用 _.becoune(方法, 等待时间) 来改写监听,以控制一定时间内的请求次数
keyWord: _.debounce( //第一个参数是调用的函数, 第二个参数是等待的时间
        function(newWord, oldWord) {
        // 将新值作为数据参数 $_GET['word'] 请求 7.php 
        axios.get('./7.php?word=' + newWord).then(function(response) {
            app.content = response.data;
        })
    },
    3000, //等待时间(3s才执行一次函数)
)

8 使用数组的对象导入样式

  • 先定义几个样式
.blue {color: blue;}
.red {color: red;}
.font {font-size: 30px;}
  • 具体代码
<div id="app">
    <!-- vbind:class 简写为 :class -->
    <!-- 会覆盖 class 定义的样式 因为 :class 会在 class 载入后再载入。 -->
    <h1 class="blue" :class="style1">测试文字</h1>
    <hr>
    <!-- 可以绑定数组 -->
    <h1 :class="[style2, style3]">测试文字</h1>
</div>

<script>
    var app = new Vue({
        el: '#app',
        data: {
            style1: {red: true, font: true}, //设置为true 则开启使用样式
            style2: 'blue', // key: value 这里的value对应 <style>里面定义的样式</style>
            style3: 'font',
        },
    });
</script>
  • v-bind:class => :class 会覆盖普通的html的 class 属性
  • :class=对象 , 在 data 中定义对象, key为自己定义的样式: value为true则确定使用 false则不使用

9 修改 style 属性的几种方式

<div id="app">
    <!-- 1、直接写对象 -->
    <p :style="{color: 'red', fontSize: size+'px'}">嗯</p> 
    <!-- 注意: 【''】单引号包起来的才是字符串,否则比如 size 就一定是在data里面定义的变量 -->
    <input type="number" v-model="size">
    
    <!-- 2、使用对象: 再次强调这里的 styleObj 是 data 里定义的对象 -->
    <p :style="styleObj">哈</p>
    
    <!-- 3、使用数组:导入多个对象  -->
    <p :style="[styleObj, styleObj2]">哦</p>
</div>

<script>
    var app = new Vue({
        el: '#app',
        data: {
            size: 20,
            styleObj: {
                color: 'blue',
                fontSize: '30px',
            },
            styleObj2: {
                background: 'red',
            }
        },
    });
</script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,057评论 0 13
  • vue概述 在官方文档中,有一句话对Vue的定位说的很明确:Vue.js 的核心是一个允许采用简洁的模板语法来声明...
    li4065阅读 7,108评论 0 25
  • 下载安装搭建环境 可以选npm安装,或者简单下载一个开发版的vue.js文件 浏览器打开加载有vue的文档时,控制...
    冥冥2017阅读 5,977评论 0 42
  • 心心念念的想着要发财,这是个很庸俗的事,就像薛之谦,他说想着现在红的时候能捞一笔是一笔。我也是这样想的,所以...
    倾述的愿望阅读 245评论 0 0