[Vue 소개] 구문 - 보간, 명령, 필터, 계산된 속성, 리스너

목차

1. 템플릿 구문

1.1 보간

1.1.1 텍스트

1.1.2 HTML 파싱

1.1.3 속성

1.1.4 표현식

1.2 지침

1.2.1 핵심 지침

1.2.3 동적 매개변수

2. 필터

2.1 로컬 필터

2.2 글로벌 필터

3. 계산된 속성

4. 모니터

5. 좌석 배치 사례

요약: 계산된 속성과 청취 속성의 차이점


1. 템플릿 구문

1.1 보간

        Vue.js는 개발자가 DOM을 기본 Vue 인스턴스의 데이터에 선언적으로 바인딩할 수 있도록 하는 HTML 기반 템플릿 구문을 사용합니다. 모든 Vue.js 템플릿은 합법적인 HTML이므로 사양을 따르는 브라우저와 HTML 파서로 구문 분석할 수 있습니다. Vue는 템플릿을 가상 DOM으로 컴파일하며, 응답 시스템과 결합하여 Vue는 다시 렌더링해야 하는 최소 구성 요소 수를 지능적으로 계산하고 DOM 작업 수를 최소화할 수 있습니다.

HTML 템플릿 구문:  문자열과 데이터를 입력으로 받아 정규식을 사용하여 자리 표시자를 필요한 데이터로 대체하여 완전한 HTML 문자열을 구성하는 문자열 기반 템플릿 기술입니다.

1.1.1 텍스트

        { {xxx}} 형식을 직접 사용하면 레이블이 데이터 객체(data)의 xxx 속성 값 으로 대체됩니다 . 바인딩된 데이터 객체의 xxx 속성 값이 변경되면 보간점의 값도 변경됩니다( 양방향 바인딩 )

<div id="xw">
       { {msg}}
</div>

1.1.2 HTML 파싱

html 형식으로 데이터를 출력하려면 v-html 명령을 사용해야 합니다.

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>html解析</title>
		<!-- 1.导入工具 -->
		<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
		<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
	</head>
	<body>
		<!-- 2.定义边界 -->
		<div id="xw">
			<div v-html="htmlstr"></div>
		</div>
		<!-- 3.构建vue实例并绑定边界 -->
		<script>
			new Vue({
				el: "#xw",
				data() {
					return {
						htmlstr: '<h3 style="color:blue;">这是一个html片段</h3>'
					}
				}
			})
		</script>
	</body>
</html>

1.1.3 속성

HTML 속성의 값은 v-bind 지시문을 사용해야 합니다. 유형은 jQuery의 $("#xxx").attr(Name, Val) 과 동일합니다.

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>html解析</title>
		<!-- 1.导入工具 -->
		<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
		<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
		<style>
			.blueClass{
				font-size: 30px;
				color: skyblue;
			}
		</style>
	</head>
	<body>
		<!-- 2.定义边界 -->
		<div id="xw">
			<p v-bind:class="hontColor">哈哈</p>
		</div>
		<!-- 3.构建vue实例并绑定边界 -->
		<script>
			new Vue({
				el: "#xw",
				data() {
					return {
						hontColor:"blueClass",
					}
				}
			})
		</script>
	</body>
</html>

다음과 같이 작성할 수도 있습니다.

//在html使用v-bind:style指令设置样式
<p v-bind:style="color">哈哈</p>
data() {
  return {
		//定义一个属性,其值为所需样式
		color:"color: yellowgreen;"
	}
}

1.1.4 표현식

 Vue는 완전한 JavaScript 표현식 지원을 제공합니다.

  • { {str.substr(0,3)}}
  • { { 숫자 + 1 }}
  • { { 알았어? '예 아니오' }}
  • <li v-bind:id="'list-' + id">내 ID는 js에 의해 동적으로 생성됩니다.</li>

예시 1: 문자 가로채기

<!-- 在html中加入元素,定义表达式 -->
<p>{
   
   {str.substring(5,9)}}</p>
data() {
	return {
		str: '大家都叫我king'
    }
}

예시 2: 매우 간단하므로 하나씩 설명하지 않겠습니다.

<p>数字:{
   
   {number+1}}</p>
<p>{
   
   {ok ? 'yes' : 'no'}}</p>
<span :id="'users_id_'+id">小威</span>
new Vue({
    el: "#xw",
        data() {
            return {
                number: 99,
                ok: false,
                id: 66
            }
        }
    })

1.2 지침

1.2.1 핵심 지침

 v-if|v-else|v-else-if: 후속 표현식의 bool 값을 기반으로 요소를 렌더링할지 여부를 결정합니다.

 v-show: 뒤에 있는 표현식이 false인 요소를 렌더링하고 해당 요소에 CSS 코드를 추가한다는 점을 제외하면 v-if와 유사합니다: style="display:none"

 v-for: JS와 유사한 순회

 v-bind: 위에서 이미 사용되었으며 속성 또는 요소를 추가합니다.

 v-on: v-on: (@로도 대체 가능)은 이전 글에서 언급한 것처럼 함수를 호출하는 데 사용됩니다.

 v-model: 바인딩된 요소의 값을 자동으로 업데이트하는 데 사용됩니다.  

예시 1:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>核心指令</title>
		<script src="js/vue&jquery.js"></script>
	</head>
	<body>
		<!-- 定义边界 -->
		<div id="xw">
			分数:<input v-model="score" />
			<div v-if="score>80">优秀</div>
			<div v-else-if="score>60">良好</div>
			<div v-else="score<60">还需努力</div>
		</div>

	</body>
	<script type="text/javascript">
		new Vue({
			el: '#xw',
			data() {
				return {
					score: 60
				}
			}
		})
	</script>

</html>

예 2:

<div v-show="score==90">v-show-上优秀学员名单</div>

예시 3:

드롭다운 상자와 확인란을 구현하기 위해 v-model과 결합

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>核心指令</title>
		<script src="js/vue&jquery.js"></script>
	</head>
	<body>
		<!-- 定义边界 -->
		<div id="xw">
			<p>v-for</p>
			<select v-model="hobbySelected">
				<option v-for="h in hobby" :value="h.id">{
   
   {h.name}}</option>
			</select>
			<div v-for="h in hobby">
				<input :value="h.id" type="checkbox" />{
   
   {h.name}}
			</div>
		</div>

	</body>
	<script type="text/javascript">
		new Vue({
			el: '#xw',
			data() {
				return {
					hobby: [{
							id: "1",
							name: "beautifulgirl"
						},
						{
							id: "2",
							name: "按摩"
						},
						{
							id: "3",
							name: "洗jio"
						}
					],
					hobbySelected: 3
				};
			}
		})
	</script>

</html>

예시 4:

<!--参数:href-->
<div>
    <a v-bind:href="url">baidu</a>
</div>
 
<!--
参数:动态参数.
attname需要在data中定义,
注意:attname要全部小写!!
-->
<div>
    <a v-bind:[attrname]="url">baidu</a>
    <button v-on:[evname]="clickme">点我看看</button>
</div>

1.2.3 동적 매개변수

참고: 동적 매개변수에서 매개변수로 사용되는 변수 이름(예: attrname)은 모두 소문자여야 합니다. 그렇지 않으면 유효하지 않습니다! !

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>动态参数</title>
		<script src="js/vue&jquery.js"></script>
	</head>
	<body>
		<!-- 定义边界 -->
		<div id="xw">
			<p>动态参数</p>
			<input v-model="evname" />
			<button v-on:[evname]="handle">动态参数</button>
		</div>
	</body>
	<script type="text/javascript">
		new Vue({
			el: '#xw',
			data() {
				return {
					evname:'dblclick'
			    }
			    methods: {
				    handle() {
				    	alert("触发事件");
				    }
			    }
		    })
	</script>
</html>

Vue는 가장 일반적으로 사용되는 두 가지 명령어인 v-bind 및 v-on에 대한 특정 약어를 제공합니다.

지침 약어
v-바인드:xxx :트리플 엑스 v-bind:href는 다음과 같이 축약됩니다:href
v-on:xxx @트리플 엑스 v-on:click은 @click으로 축약됩니다.

2. 필터

Vue는 일반적으로 일반적인 텍스트 형식에 사용되는 사용자 정의 필터를 허용합니다. 필터는 이중 중괄호 보간v-바인드 표현식의         두 위치에서 사용할 수 있습니다. 필터는 파이프 연산을 사용하여 js 표현식 끝에 추가해야 합니다. 기호 " | "

2.1 로컬 필터

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>过滤器</title>
		<script src="js/vue&jquery.js"></script>
	</head>
	<body>
		<!-- 定义边界 -->
		<div id="xw">
            {
   
   {msg}}<br />
			{
   
   {msg|single}}<br />
			{
   
   {msg|param(2,3)}}
		</div>
		<script type="text/javascript">
			// 绑定边界	ES6具体体现
			new Vue({
				el: '#xw',
				data() {
					return {
						msg: "bug快离开~bug快离开~"
					};
				},
				filters: {
					'single': function(val) {
						return val.substring(2, 3);
					},
					'param': function(val, start, end) {
						return val.substring(start, end);
					}
				}
			})
		</script>
	</body>
</html>

참고 1: 필터 함수는 표현식의 값을 첫 번째 매개변수로 받아들입니다. 
참고 2: 필터는 연결될 수 있습니다     
        . { { message | filterA | filterB }}
참고 3: 필터는 JavaScript 함수이므로 매개변수를 받아들일 수 있습니다: 
        { { message | 필터A('arg1', arg2) }} 

2.2 글로벌 필터

시간 변환 사례: 

//给Date类添加了一个新的实例方法format
Date.prototype.format = function (fmt) {
	//debugger;
    var o = {
        "M+": this.getMonth() + 1,                 //月份
        "d+": this.getDate(),                    //日
        "h+": this.getHours(),                   //小时
        "m+": this.getMinutes(),                 //分
        "s+": this.getSeconds(),                 //秒
        "q+": Math.floor((this.getMonth() + 3) / 3), //季度
        "S": this.getMilliseconds()             //毫秒
    };
    if (/(y+)/.test(fmt))
        fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt))
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
};

function fmtDate(date, pattern) {
	var ts = date.getTime();
    var d = new Date(ts).format("yyyy-MM-dd hh:mm:ss");
    if (pattern) {
        d = new Date(ts).format(pattern);
    }
    return d.toLocaleString();
};

date.js(날짜 형식)를 프로젝트 js 디렉터리에 복사하고 페이지에 도입합니다.
전역 필터 정의 

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>过滤器</title>
		<script src="js/date.js"></script>
		<script src="js/vue&jquery.js"></script>
	</head>
	<body>
		<!-- 定义边界 -->
		<div id="xw">
			<p>{
   
   {date | fmtDate}}</p>
			无过滤器:<br />
			{
   
   {date}}
		</div>
		<script type="text/javascript">
			// 全局过滤器
			Vue.filter('fmtDate', function(value) {
				return fmtDate(value, 'yyyy年MM月dd日')
			});
			// 绑定边界	ES6具体体现
			new Vue({
				el: '#xw',
				data() {
					return {
						date: new Date()
					};
				}
			})
		</script>
	</body>
</html>

3. 계산된 속성

   계산된 속성을 사용하면 뷰에 표시된 속성을 빠르게 계산할 수 있습니다. 이러한 계산은 필요한 경우에만 캐시되고 업데이트됩니다.

사용 시나리오: 속성에 해당 값을 얻기 위해 복잡한 논리적 작업이 필요한 경우 계산된 속성을 사용할 수 있습니다. 결과가 반환되는 한 작업, 메소드 호출 등을 포함하여 다양한 복잡한 논리가 계산된 속성에서 완료될 수 있습니다. 끝.


구문: 계산:{}

장바구니 케이스:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>计算属性</title>
		<script src="js/vue&jquery.js"></script>
	</head>
	<body>
		<!-- 定义边界 -->
		<div id="xw">
			<p>计算属性</p>
			<table border="1" style="width: 600px;height: 300px;">
				<tr>
					<td>物品</td>
					<td>单价</td>
					<td>
						数量
					</td>
					<td>
						小计
					</td>
				</tr>
				<tr>
					<td>帽子</td>
					<td>{
   
   {maoziDanjia}}</td>
					<td>
						<input v-model="maozi" />
					</td>
					<td>
						{
   
   {maoziTotal}}
					</td>
				</tr>
				<tr>
					<td>衣服</td>
					<td>{
   
   {yifuDanjia}}</td>
					<td>
						<input v-model="yifu" />
					</td>
					<td>
						{
   
   {yifuTotal}}
					</td>
				</tr>
				<tr>
					<td>裤子</td>
					<td>{
   
   {kuziDanjia}}</td>
					<td>
						<input v-model="kuzi" />
					</td>
					<td>
						{
   
   {kuziTotal}}
					</td>
				</tr>
				<tr>
					<td>总价</td>
					<td colspan="3">{
   
   {total}}</td>
				</tr>
			</table>
		</div>
	</body>
	<script type="text/javascript">
		// 绑定边界	ES6具体体现
		new Vue({
			el: '#xw',
			data() {
                //定义所需属性值
				return {
					maoziDanjia: 10,
					yifuDanjia: 30,
					kuziDanjia: 20,
					maozi: 1,
					yifu: 1,
					kuzi: 1,
					km: 2,
					m: 2000
				};
			},
			computed: {
				maoziTotal() {
					return this.maoziDanjia * this.maozi;
				},
				yifuTotal() {
					return this.yifuDanjia * this.yifu;
				},
				kuziTotal() {
					return this.kuziDanjia * this.kuzi;
				},
				total() {
					return this.maoziTotal + this.yifuTotal + this.kuziTotal;
				}
			}
		})
	</script>
</html>

4. 모니터

듣기 속성 watch, watch를 통해 데이터 변경에 대응할 수 있습니다.
   

구문: 시계:{}

예: 미터와 센티미터 간의 단위 변환

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>计算属性</title>
		<script src="js/vue&jquery.js"></script>
	</head>
	<body>
		<!-- 定义边界 -->
		<div id="xw">
			<p>监听属性</p>
			米:<input v-model="m" />
			厘米:<input v-model="cm" />
		</div>
	</body>
	<script type="text/javascript">
		// 绑定边界	ES6具体体现
		new Vue({
			el: '#xw',
			data() {
				return {
					m: 2,
					cm: 200
				};
			},
			watch: {
				// v指的是m变量
				m: function(v) {
					this.cm = parseInt(v) * 100;
				},
				// v指的是km变量
				cm: function(v) {
					this.m = parseInt(v) / 100;
				}
			}
		})
	</script>
</html>

5. 좌석 배치 사례

<!DOCTYPE html>
<html>
	<head>
		<title>排座</title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<h2>排座</h2>
			<input type="text" v-model="seatInput1">
			<input type="text" v-model="seatInput2">
			<input type="text" v-model="seatInput3">
			<hr>
			<h3>用户:</h3>
			<ul>
				<!-- 遍历过滤器传来的值 -->
				<li v-for="user in filteredUsers" :key="user.id">{
   
   { user.name }}</li>
			</ul>
			<hr>
		</div>

		<script>
			new Vue({
				el: '#app',
				data: {
					seatInput1: '',
					seatInput2: '',
					seatInput3: '',
					users: [{
							id: 1,
							name: '老王'
						},
						{
							id: 2,
							name: '老六'
						},
						{
							id: 3,
							name: '老八'
						},
						{
							id: 4,
							name: '老聂'
						},
						{
							id: 5,
							name: '老五'
						}
					]
				},
				/* 定义一个filteredUsers计算属性 */
				computed: {
					/* 使用filter方法来过滤users数组中的元素。filter方法接受一个回调函数作为参数,该回调函数会对数组中的每个元素进行判断,并返回一个新的数组,其中包含满足条件的元素。 */
					filteredUsers() {
						return this.users.filter(
							/* 使用=>箭头函数的语法来定义一个匿名函数。这个匿名函数接受一个参数user,表示users数组中的每个元素。 */
							user => {
								/* 使用逻辑运算符&&来判断user.name是否不等于seatInput1、seatInput2和seatInput3的值。如果满足这个条件,说明user.name不等于任何一个输入框的值,那么这个元素就会被保留在过滤后的数组中。 */
								return user.name !== this.seatInput1 &&
									user.name !== this.seatInput2 &&
									user.name !== this.seatInput3
							});
					}
				}
			});
		</script>
	</body>
</html>

요약: 계산된 속성과 청취 속성의 차이점

계산된 속성: 다른 속성을 기반으로 계산되는 속성입니다. 해당 값은 종속된 속성을 기반으로 동적으로 계산되고 , 캐시되며, 종속 속성이 변경될 때만 다시 계산됩니다. 계산된 속성은 복잡한 계산이나 다른 속성을 기반으로 한 처리가 필요한 시나리오에 적합합니다. 계산된 속성을 사용하면 복잡한 논리를 캡슐화하여 코드를 더 명확하고 유지 관리하기 쉽게 만들 수 있습니다.

Listening 속성: 지정된 속성의 변경 사항을 수신하고 해당 작업을 수행하는 데 사용되는 속성입니다. 모니터링되는 속성이 변경 되면 지정된 콜백 함수를 실행하여 변경 사항에 응답할 수 있습니다. 속성 수신은 속성이 변경될 때 비동기식 또는 비용이 많이 드는 작업을 수행해야 하는 시나리오에 적합합니다. 수신 속성을 사용하면 속성 변경 사항을 실시간으로 모니터링하고 네트워크 요청 전송, 복잡한 계산 수행 등 해당 작업을 수행할 수 있습니다.

        계산된 속성은 다른 속성을 기반으로 결과가 계산되는 시나리오에 적합하고, 수신 속성은 속성 변경을 실시간으로 모니터링하고 해당 작업을 수행해야 하는 시나리오에 적합합니다. 둘 사이의 차이점은 계산된 속성은 다른 속성을 기반으로 결과를 계산하는 반면 수신 속성은 속성이 변경되면 해당 작업을 수행한다는 것입니다.

추천

출처blog.csdn.net/Justw320/article/details/132985947