Vue_Share_Mol

Vue_Share_Mol

@(我的分享)


按照惯例,扯闲篇

本次分享建立在一个假设为前提,假设你们都已经熟练地使用jquery。

伟大的jQuery

 不得不承认,jquery是一个非常伟大的发明,jquery有非常强大的选择器,比起getelementById来,不知道要好用多少,而且它还为开发人员做了很多浏览器兼容方面的工作,最明显的例子就是jQuery.Ajax()。有了这个ajax方法,你不用再云根据浏览器内核的不同而创建不同的对象发送请求。
 jQuery是基于DOM来操作的。也就是说,我们在操作页面的时候,一定是先获取到了某个dom元素,再对这个dom进行操作。比如我想找到页面上一个id为"mollable"的label元素,并修改的显示文字为“修改后的文字”,我需要这样做:

$('label#mollable').html('修改后的文字');

 这样看起来很好,目的明确、操作清晰。

 有很多时候,我们需要把数据从服务端获取过来,再加载到前端。这个时候,我们就需要大量的拼接HTML。比如,我需要在ul上面新增一条名为“《大话代码架构》”的记录。
 原始HTML如下:

<ul>
	<li>《春风八百里,不如遇见你》</li>
	<li>《ASP.net入门很简单》</li>
</ul>

 我要的js代码看起来像是这样:

$('<li>《大话代码架构》</li>').apendTo($('ul'));

 这是比较简单的代码。在很多时候,我们要增加的dom元素远远没有这么简单。那么,html拼接的过程就极有可能出错。 这时,出现了“模板引擎”,我以前常用的模板引擎是arttemplate。当然,也有其它非常优秀的引擎框架。

以arttemplate说明

 所谓模板引擎,大家一定听说过,像C#里面有伟大的NVelocity,或者你们使用过的一些CMS模板也可以算是模板引擎。模板引擎的思想,就是先搞一个模板,然后再这个模板上挖坑,最后用数据来填坑。下面,我将以arttemplate来说明.
 假设我有这样一个页面,这个页面上要展示人员的信息,人员信息包含姓名、性别、年龄。

<div id="container">
	<ul id="ulPersonList">
		<li>
			<div>
				<img src="头像" />
				<label>姓名</label>
				<label>性别</label>
				<label>年龄</label>
			</div>
		</li>
	</ul>
</div>

 接下来,我要根据这个页面来挖坑了,挖坑的原则很简单,就是把变化地的方都找出来,用“占位符”来代替。比如上面代码中的头像、姓名、性别、年龄这几个地方都是会变的,所以我就把他们用用占位符来表示,如下:

<script id="test" type="text/html">
	<li>
		<div>
			<img src="{{headImg}}" />
			<label>{{name}}</label>
			<label>{{gender}}</label>
			<label>{{age}}</label>
		</div>
	</li>
</script>

 第三步,我要把数据填充到模板中的“占位符”上。

// 定义一个数据
var data = {
    headImg:"/img/1.jpg",
    name:"testName",
    gender:"男",
    age:32
    };
// 调用arttemplate的template方法,传入数据、模板,得到结果字符串
var html = template('test', data);
// 将得到的字符串拼接到ul中
$(html).appentTo($('ul'));

 到这里为止,模板引擎的示例就演示完了。可以看到,核心代码是

// 调用arttemplate的template方法,传入数据、模板,得到结果字符串
var html = template('test', data);

 这句话的目的是得到一个字符串,这个字符串就好像我们自己写字符串拼接代码一样。只不过有了arttemplate的帮助,我们可以借助模板来得到目的字符串。但,本质还是要得到一个字符串,让后面的代码把得到的字符串拼接到dom元素上。

进入Vue

引言

 上面我们提到了jquery的dom操作和模板引擎。如果程序员使用jquery或模板引擎来绘制页面,那你必须同时关心前端页面元素和后台数据。有没有一种技术,让我们像asp.net mvc一样,只需要进行数据绑定,就可以进行页面显示了。

PS:这里我的描述不太清晰,我的目的是这样的,我在cs文件中定义一个对象ViewBag.Num=1,我以页面中可以通过@ViewBag的形式将数字1显示在页面上。这就是我想表述的内容。

 这就是一种mvc思想,也有人叫mvvm,但是我不想解释得那么复杂(主要是我不会)。让数据的变化反应到页面上,也让页面的变化反应到数据上。

eg.

<div id="el">
	<input type="number" v-model="fir" />+
	<input type="number" v-model="sec" />=
	<label>{{parseInt( this.fir)+ parseInt( this.sec)}}</label>
</div>	
<script>
// 创建一个Vue对象 它的构造函数是之样的:new Vue(参数)
// 只不过参数是一个对象而以。
new Vue({
			el:"#el",// 指示Vue容器是一个id为el的标签
			data:{fir:0,sec:0,result:0}// vue中用到的数据。
		});
</script>

运行效果:

们把js代码中data看做是mvc中的Model。把<div id='el'></div>看成是视图,这样就完成了“双向绑定”。

 这就是一个简单的vue示例,有没有发现,我们已经不用再使用“先获取dom元素,再进行数据绑定”的方式来显示数据了。
 如果我们把页面切分成两部分。第一部分是<div id="el"></div>。第二部分是data:{...}。那么,完成可以由两个不同的人来未完成这两个部分。它们之间没有太多的耦合。烈军属data的人,只负责提供数据,不需要关心页面展示。而写页面的人,只需要把“字段”展示到界面上,不需要关心这些字段是怎么来的。
 mvc中,还有一个很重要的部分,叫controller,在vue中,对应于methods和cumputed。
 先来看metchods。

new Vue(
{
	el:'#el',
	data:{fir:0,sec:0,result:0},
	// 我定义了methods中包含元素,注意,methods不是我创造的,而是vue规定的
	methods:{
		// 定义一个名为clickAdd的函数,这个函数用来把Model中的fir和sec相加,
		// 并把结果赋给Model中的result
		clickAdd:function(){this.result=this.fir+this.sec},
	}
}
);

 methods是一个元素,这个元素被定义在构造函数的输入参数中。methods这个元素是一个对象,这个对象可以包含0个或多个函数。像上面的代码就包含了一个函数。接下来看看这个methods怎么用。
 按照上面所说的,我们再写一个页面

<div id='el'>
<input type="number" v-model="fir" />+
	<input type="number" v-model="sec" />
	<button type='button' onclick='showResult()'>=</button>
	<label>{{result}}</label>
</div>

 这样写完以后,浏览器会告诉你,showResult没有定义。这里需要注意,你写在vue块(我把<div id='el'></div>所包含的代码块叫“vue块“)中的属性或值,一定要符合vue的风格。幸好,我们只需要记住两种风格就可以。

风格1-内容

 通常来说,我们指定一个label的内容会是这样:

<label>{{字段}}</label>

 可以看到,语法结构就是两个大括号包含的一个字段名,这个字段一定要在data属性中定义好。

new Vue({
el:'#el',
data:{字段:'mol'}
});

风格2-属性

 如果我要指定一个属性,如点击事件的属性,我应该这样做:

<label v-on:click="myClick()"></label>

 当然,你非要使用onclick属性来定义单击事件的话,也无可厚非,只不过这样的话,你就不能操作vue内部的对象了。

注意,v-on:click="myClick()"中的myClick这个函数一定要在methods中定义。

new Vue({
el:"#el",
data:{},
methods:{
	myClick:function(){
        这里是你要做的动作
	}
}
});

入门需要注意的重点

v-show和dislay属性

  我们都知道,控制一个元素是否显示,可以设计这个元素的style="display:值",值为block时,显示;值为none时,元素不显示。而在vue中,有一个属性叫v-show,它也是控制元素是否显示的。也就是说,下面两句代码的效果看起来是一样的。

<div style="display:none;">我要想被隐藏</div>
<div v-show="false">我也想要被隐藏</div>

 之所以是“看起来是一样的”,是因为:display:none的作用是,将dom元素的可见属性设置为none;而v-show="false"是根本不绘制这个dom元素。可以通过查看网页源码来验证我说的是否正确。

if & for

 if和for就不用我解释他们是干什么的了,直接上代码:

<div v-if="myage<12">小学</div>
<div v-else-if="myage<16">初中</div>
<div  v-else-if="myage<19">高中</div>
<div v-else-if="myage<23">大学</div>
<div v-else="">工作</div>
<hr>
<ul>
	<li v-for="p in team">
		姓名:{{p.name}}<br>
		年龄:{{p.age}}
	</li>
</ul>
<script>
var vueNode=new Vue({
			el:"#app",
			data:{
			myage:32,
			team:[{name:'mol',age:32},{name:'李老板',age:33},{name:'嚣张哥',age:34}]}
		});
</scrit>

深入mvc

 可以看到,vue的属性都是以v-开头。接下来,我们体验一下,vue的mvc思想及双向绑定。
 前面我们已经通过for循环来展示了一个列表,它看起来像是这样:

加li,应该怎么做。
 熟悉jquery的你,一定会说,先获取到ul,再进行元素的添加,它看起来像是这样:

$('ul').append('<li>姓名:小曾,年龄:奔三</li>');

 这样做完全没有问题。但这样做有一个问题,就是前端和数据之间是“强耦合”的。我们更希望有这样两个程序员,一个人写后端(数据),另一个人写前端(页面).而vue就可以达到这样的效果。
步骤1:前端人员写页面

<div id='el'>
	<ul>
		<li v-for="p in team">
			姓名:{{p.name}}<br>
			年龄:{{p.age}}
		</li>
	</ul>
	<!--下面是让用户动态输入信息的地方-->
	姓名:<input type="text" v-model="newName" />
	<br>
	年龄:<input type="number" v-model="newAge" />
	<br>
	<button v-on:click="addUser">添加</button>
</div>

步骤2:后端人员写数据

new Vue({
			el:"#app",
			data:{
				team:[{name:'mol',age:32},{name:'李老板',age:33},{name:'嚣张哥',age:34}],
				newName:'',newAge:''
			},
			methods:{
				addUser:function(){					this.team.push({name:this.newName,age:this.newAge});
				}
			}
		});
		

完事了!
 看见木有?后端工程师只需要操作data中定义的数据就可以了。当team数据发生变化时,页面上的展示也相应地发生了变化,看起来像是这样:

总结

 做为一个.net出身的程序员来说,可能无法理解,做为一个“后端程序员”,怎么可能简单地写几行js就了事?再说了,js不应该是前端工程师的责任吗?
 首先,前端工程师的js普遍没有程序员的好;其次,js是一种很牛X的开发语言。现在有很多网站或应用都可以直接使用js来开发。我打算下次分享一个叫electro的技术。它就是用js来编写应用的一种技术。

posted @ 2017-09-25 21:43  飞荷扬菊  阅读(744)  评论(0)    收藏  举报