Vue入门实战教程(五)—— 控制层:方法及过滤器

此学习教程是对官方教程的解析,

本章节主要涉及到的官方教程地址:

过滤器 — Vue.js

上一章 :Vue入门实战教程(四)—— 模型层:数据

方法分类

方法分为两种,一种是实用工具方法,相当于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入门实战教程 | 寒于水学习网

下一章:Vue入门实战教程(六)—— 组件基础

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值