此学习教程是对官方教程的解析,
本章节主要涉及到的官方教程地址:
方法分类
方法分为两种,一种是实用工具方法,相当于utils, 用于通用处理,与具体业务处理逻辑无关;一种是专门处理业务逻辑的方法。
看一个vue官方教程实战(四)模型层-数据中提到的例子:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="example">
<p>Original message:{{ message }}</p>
<!-- 计算属性 -->
<p>Reversed message: {{ reverseMessage }}</p>
</div>
<script>
var vm = new Vue({
el: '#example',
data: {
message: 'hello'
},
computed: {
reverseMessage : function () {
return this.message.split('').reverse().join('')
}
}
})
</script>
</body>
</html>
实用工具方法
用实用工具方法来实现上例中的message字母翻转:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="example">
<p>Original message:{{ message }}</p>
<!-- 计算属性 -->
<p>Reversed message: {{ reverseMessage }}</p>
<!-- 不带参数实用工具方法 -->
<p>Reversed message: "{{ reversedMessage1() }}"</p>
<!-- 带一个参数的实用工具方法-->
<p>Reversed message: "{{ reversedMessage2(message) }}"</p>
</div>
<script>
var vm = new Vue({
el: '#example',
data: {
message: 'hello'
},
computed: {
reverseMessage : function () {
return this.message.split('').reverse().join('')
}
},
//方法
methods: {
<!-- 实用工具方法, 一般有返回值 -->
reversedMessage1: function () {
return this.message.split('').reverse().join('')
},
reversedMessage2: function (message) {
return message.split('').reverse().join('')
}
}
})
</script>
</body>
</html>
在模板中方法可以嵌套,比如下面的例子又定义了一个首字母大写的实用工具方法,你可以将message字母翻转后的文本再做为参数转入这个方法,使得翻转后的文本首字母变大写:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="example">
<p>Original message:{{ message }}</p>
<!-- 计算属性 -->
<p>Reversed message: {{ reverseMessage }}</p>
<!-- 不带参数实用工具方法 -->
<p>Reversed message: {{ reversedMessage1() }}</p>
<!-- 带一个参数的实用工具方法-->
<p>Reversed message: {{ reversedMessage2(message) }}</p>
<!-- 方法嵌套 -->
<p>Reversed message: {{ capitalize(reversedMessage2(message))}}</p>
</div>
<script>
var capitalize = function (value) {
if (!value) return ''
value = value.toString()
return value.charAt(0).toUpperCase() + value.slice(1)
}
var vm = new Vue({
el: '#example',
data: {
message: 'hello'
},
computed: {
reverseMessage : function () {
return this.message.split('').reverse().join('')
}
},
//方法
methods: {
<!-- 实用工具方法, 一般有返回值 -->
reversedMessage1: function () {
return this.message.split('').reverse().join('')
},
reversedMessage2: function (message) {
return message.split('').reverse().join('')
},
capitalize: function (value) {
return capitalize(value);
}
}
})
</script>
</body>
</html>
业务逻辑处理方法
为了简单起见,本例业务逻辑处理方法和实用工具方法处理逻辑一致; 个人建议由事件触发的业务逻辑处理方法以"on"开头,且显示在非事件触发方法前面,形成一种规范:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="example">
<p>Original message:{{ message }}</p>
<!-- 计算属性 -->
<p>Reversed message: {{ reverseMessage }}</p>
<!-- 逻辑处理方法 -->
<button v-on:click="onReverseMessage">反转消息</button>
<!-- 不带参数实用工具方法 -->
<p>Reversed message: {{ reversedMessage1() }}</p>
<!-- 带一个参数的实用工具方法-->
<p>Reversed message: {{ reversedMessage2(message) }}</p>
<!-- 方法嵌套 -->
<p>Reversed message: {{ capitalize(reversedMessage2(message))}}</p>
</div>
<script>
var capitalize = function (value) {
if (!value) return ''
value = value.toString()
return value.charAt(0).toUpperCase() + value.slice(1)
}
var vm = new Vue({
el: '#example',
data: {
message: 'hello'
},
computed: {
reverseMessage : function () {
return this.message.split('').reverse().join('')
}
},
//方法
methods: {
<!-- 逻辑处理方法, 直接处理数据 -->
onReverseMessage: function () {
this.message = this.message.split('').reverse().join('')
},
<!-- 实用工具方法, 一般有返回值 -->
reversedMessage1: function () {
return this.message.split('').reverse().join('')
},
reversedMessage2: function (message) {
return message.split('').reverse().join('')
},
capitalize: function (value) {
return capitalize(value);
}
}
})
</script>
</body>
</html>
过滤器
过滤器本质上就是实用工具方法,而且可以串联,也就是把前面过滤的结果作为参数再进行过滤。直接上局部注册的过滤器例子:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="example">
<p>Original message:{{ message }}</p>
计算属性:<Br/>
<!-- 计算属性 -->
<p>Reversed message: {{ reverseMessage }}</p>
逻辑处理方法:<Br/>
<!-- 逻辑处理方法 -->
<button v-on:click="onReverseMessage">反转消息</button>
<Br/><Br/>实用工具方法:<Br/>
<!-- 不带参数实用工具方法 -->
<p>Reversed message: {{ reversedMessage1() }}</p>
<!-- 带一个参数的实用工具方法-->
<p>Reversed message: {{ reversedMessage2(message) }}</p>
<!-- 方法嵌套 -->
<p>Reversed message: {{ capitalize(reversedMessage2(message))}}</p>
过滤器:<Br/>
<!-- 带一个参数的过滤器 -->
<p>Reversed message: {{ message | reversedMessage22 }}</p>
<!-- 过滤器串联 -->
<p>Reversed message: {{ message | reversedMessage22 | capitalize}}</p>
<!-- 带两个参数的过滤器 -->
<p>Reversed message: {{ message | reversedMessage222(true) }}</p>
</div>
<script>
var capitalize = function (value) {
if (!value) return ''
value = value.toString()
return value.charAt(0).toUpperCase() + value.slice(1)
}
var vm = new Vue({
el: '#example',
data: {
message: 'hello'
},
computed: {
reverseMessage : function () {
return this.message.split('').reverse().join('')
}
},
//方法
methods: {
<!-- 逻辑处理方法, 直接处理数据 -->
onReverseMessage: function () {
this.message = this.message.split('').reverse().join('')
},
<!-- 实用工具方法, 一般有返回值 -->
reversedMessage1: function () {
return this.message.split('').reverse().join('')
},
reversedMessage2: function (message) {
return message.split('').reverse().join('')
},
capitalize: function (value) {
return capitalize(value);
}
},
filters: {
reversedMessage22: function (message) {
return message.split('').reverse().join('')
},
reversedMessage222: function (message, isCapitalize) {
var mes = message.split('').reverse().join('')
if(isCapitalize)
return capitalize(mes);
else
return mes;
},
capitalize: function (value) {
return capitalize(value);
}
}
})
</script>
</body>
</html>
可以看到使用过滤器确实要清晰不少,不会像方法嵌套一样,这么多括号容易出错。
过滤器还可以全局注册。我们用全局注册重写上面的例子。首先在例子所在页面目录下的js/utils目录新建vue_method_utils.js,里面放上
utils:
var reversedMessage = function (message) {
return message.split('').reverse().join('')
}
var capitalize = function (value) {
if (!value) return ''
value = value.toString()
return value.charAt(0).toUpperCase() + value.slice(1)
}
js/filter目录新建vue_method_filter.js,里面放上全局注册的过滤器:
Vue.filter('reversedMessage22', function (message) {
return reversedMessage(message)
})
Vue.filter('reversedMessage222', function (message, isCapitalize) {
var mes = reversedMessage(message)
if(isCapitalize)
return capitalize(mes);
else
return mes;
})
Vue.filter('capitalize', function (value) {
return capitalize(value);
})
最后主页面代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="js/utils/vue_method_utils.js"></script>
<script src="js/filter/vue_method_filter.js"></script>
</head>
<body>
<div id="example">
<p>Original message:{{ message }}</p>
计算属性:<Br/>
<!-- 计算属性 -->
<p>Reversed message: {{ reverseMessage }}</p>
逻辑处理方法:<Br/>
<!-- 逻辑处理方法 -->
<button v-on:click="onReverseMessage">反转消息</button>
<Br/><Br/>实用工具方法:<Br/>
<!-- 不带参数实用工具方法 -->
<p>Reversed message: {{ reversedMessage1() }}</p>
<!-- 带一个参数的实用工具方法-->
<p>Reversed message: {{ reversedMessage2(message) }}</p>
<!-- 方法嵌套 -->
<p>Reversed message: {{ capitalize(reversedMessage2(message))}}</p>
过滤器:<Br/>
<!-- 带一个参数的过滤器 -->
<p>Reversed message: {{ message | reversedMessage22 }}</p>
<!-- 过滤器串联 -->
<p>Reversed message: {{ message | reversedMessage22 | capitalize}}</p>
<!-- 带两个参数的过滤器 -->
<p>Reversed message: {{ message | reversedMessage222(true) }}</p>
</div>
<script>
var vm = new Vue({
el: '#example',
data: {
message: 'hello'
},
computed: {
reverseMessage : function () {
return reversedMessage(this.message);
}
},
//方法
methods: {
<!-- 逻辑处理方法, 直接处理数据 -->
onReverseMessage: function () {
this.message = reversedMessage(this.message);
},
<!-- 实用工具方法, 一般有返回值 -->
reversedMessage1: function () {
return reversedMessage(this.message);
},
reversedMessage2: function (message) {
return reversedMessage(message);
},
capitalize: function (value) {
return capitalize(value);
}
}
})
</script>
</body>
</html>
建议使用过滤器来代替计算属性和实用工具方法,更加直观,灵活且不容易出错。methods里面只保留业务处理方法。
最后精简的例子:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="js/utils/vue_method_utils.js"></script>
<script src="js/filter/vue_method_filter.js"></script>
</head>
<body>
<div id="example">
<p>Original message:{{ message }}</p>
<!-- 逻辑处理方法 -->
<button v-on:click="onReverseMessage">反转消息</button>
<!-- 反转消息 -->
<p>Reversed message: {{ message | reversedMessage22 }}</p>
<!-- 反转消息首字母变大写 -->
<p>Capitalize Reversed message: {{ message | reversedMessage22 | capitalize}}</p>
</div>
<script>
var vm = new Vue({
el: '#example',
data: {
message: 'hello'
},
//方法
methods: {
<!-- 逻辑处理方法, 直接处理数据 -->
onReverseMessage: function () {
this.message = reversedMessage(this.message);
}
}
})
</script>
</body>
</html>
本章节教程结束。
全部教程地址:Vue入门实战教程 | 寒于水学习网