vue 相关

hello world

知识点:hello world 结构


<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Documenttitle>
  <script src="https://unpkg.com/vue@next">script>
head>
<body>
  <div id="root">div>
  <script>
    Vue.createApp({
      
      template: '
hello world
'
}).mount("#root");
script> body> html>

定时器例子

知识点: 数据绑定


<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Documenttitle>
  <script src="https://unpkg.com/vue@next">script>
head>
<body>
  <div id="root">div>
  <script>
    Vue.createApp({
      
      data() {
      
        return {
      
          count: 1
        }
      },
      template: '
{ {count}}
'
, mounted() { setInterval(() => { this.count++; }, 1000); } }).mount("#root");
script> body> html>

字符串反转例子

知识点: v-on 监听事件


<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Documenttitle>
  <script src="https://unpkg.com/vue@next">script>
head>
<body>
  <div id="root">div>
  <script>
    Vue.createApp({
      
      data() {
      
        return {
      
          content: 'hello world'
        }
      },
      methods: {
      
        handleReverse() {
      
          this.content = this.content.split('').reverse().join('');
        }
      },
      template: `
        
{ {content}}
`
}).mount("#root");
script> body> html>

TodoLIst 例子

知识点:v-model 双向绑定,v-for 循环


<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Documenttitle>
  <script src="https://unpkg.com/vue@next">script>
head>
<body>
  <div id="root">div>
  <script>
    Vue.createApp({
      
      data() {
      
        return {
      
          inputValue: '',
          list: []
        }
      },
      methods: {
      
        handleAddItem() {
      
          this.list.push(this.inputValue);
          this.inputValue = '';
        }
      },
      template: `
        
  • { {item}} { {index}}
`
}).mount("#root");
script> body> html>

组件拆分 TodoList

  • 拆分组件
  • vue 中如果想在属性上绑定 vue 变量,需要在属性前增加 v-bind。

<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Documenttitle>
  <script src="https://unpkg.com/vue@next">script>
head>
<body>
  <div id="root">div>
  <script>
    const app = Vue.createApp({
      
      data() {
      
        return {
      
          inputValue: '',
          list: []
        }
      },
      methods: {
      
        handleAddItem() {
      
          this.list.push(this.inputValue);
          this.inputValue = '';
        }
      },
      template: `
        
`
}); app.component('todo-item', { props: ['item', 'index'], template: '
  • { {index}}--{ {item}}
  • '
    }); app.mount("#root");
    script> body> html>

    Vue 中应用和组件的基础概念

    // createApp 表示创建一个 Vue 应用,存储到 app 变量中
    // 传入的参数表示,这个应用最外层的组件,应该如何展示
    // mvvm 设计模式, m -> model 数据,v -> view 视图,vm -> viewModel 视图数据连接层
    const app = Vue.createApp({
         
    	data() {
         
    		return {
         
    			message: 'hello world'
    		}
    	},
    	template: '
    { {message}}
    '
    ; }); // vm 代表的就是 vue 应用的根组件 const vm = app.mount('#root'); // vm.$data.message

    生命周期函数

    // 生命周期函数:在某一时刻会自动执行的函数
    const app = Vue.createApp({
         
    	data() {
         
    		return {
         
    			message: 'hello world'
    		}
    	},
    	// 在实例生成之前会自动执行的函数
    	beforeCreate() {
         
    		console.log('beforeCreate');
    	},
    	// 在实例生成之后会自动执行的函数
    	created() {
         
    		console.log('created');
    	},
    	// 在模板已经被编程函数之后立即自动执行的函数
    	// 在组件内容被渲染到页面之前自动执行的函数
    	beforeMount() {
         
    		console.log('beforeMount');
    	},
    	// 在组件内容被渲染到页面之后自动执行的函数
    	mounted() {
         
    		console.log('mounted');
    	},
    	// 当 data 中的数据发生变化时会自动执行的函数
    	beforeUpdate() {
         
    		console.log('beforeUpdate');
    	},
    	// 当 data 中的数据发生变化,同时页面完成更新后,会自动执行的函数
    	updated() {
         
    		console.log('updated');
    	},
    	// 当 Vue 应用失效时,自动执行的函数
    	beforeUnmount() {
         
    		console.log('beforeUnmount');
    	},
    	// 当 vue 应用失效时,且 dom 完全销毁之后,自动执行的函数
    	unmounted() {
         
    		console.log('unmounted');
    	}
    });
    

    想要显示的变量内容不作 html 转义

    const app = Vue.createApp({
         
    	data() {
         
    		return {
         
    			message: 'hello world'
    		}
    	},
    	tempate: '
    '
    ; }); const vm = app.mount('#root');

    { {}} 插值表达式中可以插入 js 表达式,但是不能写 js 语句

    内容不随变量的变化而变化,而是只使用第一次的值

    const app = Vue.createApp({
         
    	data() {
         
    		return {
         
    			message: 'hello world'
    		}
    	},
    	template: '
    { {message}}
    '
    }); const vm = app.mount('#root');

    元素是否显示

    const app = Vue.createApp({
         
    	data() {
         
    		return {
         
    			message: 'hello world',
    			show: true
    		}
    	},
    	template: '
    { {message}}
    '
    }); const vm = app.mount('#root');

    事件绑定

    const app = Vue.createApp({
         
    	data() {
         
    		return {
         
    			message: 'hello world'
    		}
    	},
    	methods: {
         
    		handleClick() {
         
    			alert('click');
    		}
    	},
    	template: '
    { {message}}
    '
    }); const vm = app.mount('#root');

    v-on,v-bind 的简写

    const app = Vue.createApp({
         
    	data() {
         
    		return {
         
    			message: 'hello world'
    		}
    	},
    	methods: {
         
    		handleClick() {
         
    			alert('click');
    		}
    	},
    	template: '
    { {message}}
    '
    }); const vm = app.mount('#root');

    动态属性

    动态属性可以在属性变量上加 [] 中括号来实现

    const app = Vue.createApp({
         
    	data() {
         
    		return {
         
    			message: 'hello world',
    			name: 'title',
    			event: 'click'
    		}
    	},
    	methods: {
         
    		handleClick() {
         
    			alert('click');
    		}
    	},
    	template: '
    { {message}}
    '
    }); const vm = app.mount('#root');

    修饰符阻止默认行为

    const app = Vue.createApp({
         
    	data() {
         
    		return {
         
    			message: 'hello world',
    			name: 'title',
    			event: 'click'
    		}
    	},
    	methods: {
         
    		handleClick() {
         
    			alert('click');
    		}
    	},
    	template: `
    		
    `
    }); const vm = app.mount('#root');

    计算属性

    const app = Vue.createApp({
         
    	data() {
         
    		return {
         
    			message: 'hello world',
    			count: 2,
    			price: 5
    		}
    	},
    	// 当计算属性依赖的内容发生变更时,才会重新执行
    	computed: {
         
    		total() {
         
    			return this.count * this.price;
    		}
    	},
    	methods: {
         
    		// 只要页面重新渲染,就会重新计算
    		getTotal() {
         
    			return this.count * this.price;
    		}
    	},
    	template: `
    { {total}}
    `
    }); const vm = app.mount('#root');

    侦听器

    const app = Vue.createApp({
         
    	data() {
         
    		return {
         
    			message: 'hello world',
    			count: 2,
    			price: 5,
    			newTotal: 0,
    		}
    	},
    	watch: {
         
    		// price 发生变化时,函数会执行
    		price() {
         
    			this.newTotal = this.price * this.count;
    		}
    	},
    	computed: {
         
    		// 当计算属性依赖的内容发生变更时,才会重新执行计算
    		total() {
         
    			return this.count * this.price;
    		}
    	},
    	template: `
    { {newTotal}}
    `
    }); const vm = app.mount('#root');

    总结

    computed 和 method 都能实现的一个功能,建议使用 computed,因为有缓存
    computed 和 watcher 都能实现的功能,建议使用 computed 因为更加简洁

    样式

    const app = createApp({
         
    	data: {
         
    		classString: 'red',
    		classObject: {
         red: false, green: true},
    		classArr: ['red', 'green', {
         brown: true}]
    	},
    	template: `
    		
    `
    }); const vm = app.mount('#root');

    父组件与子组件的 class

    • 如果子组件的最外层只有一个标签那么父组件中调用时传入的 class 就直接会生效,如果子组件的最外城有多个标签那么外部父组件调用时传入的 class 就不会直接生效,需要子组件自己使用。
    const app = createApp({
         
    	template: `
    		
    hello world
    `
    }); app.component('demo', { template: `
    one
    two
    `
    ; }); const vm = app.mount('#root');

    行内样式的定义

    const app = Vue.createApp({
         
    	data: {
         
    		styleString: 'color: yellow',
    		styleObject: {
         
    			color: 'yellow'
    		},
    	},
    	template: '
    hello world
    '
    ; }); const vm = app.mount('root');

    v-if,v-show

    如果频繁显示隐藏,用 v-show,避免频繁的销毁创建元素

    ...
    template:  `
    	
    `
    ; ...
    template: `
    	
    if
    else if
    else
    `
    ;

    v-for

    const app = Vue.createApp({
         
    	data: {
         
    		listArray: ['first', 'second', 'thrid'],
    		listObject: {
         
    			first: 1,
    			second: 2,
    			thrid: 3
    		}
    	},
    	template: `
    		
    { {item}}
    { {item}} -- { {index}}
    { {value}} -- { {key}}
    { {value}} == { {key}} -- { {index}}
    `
    });

    为了提升 vue 的效率,在进行 v-for 循环的时候要给循环加 key值

    template: `
    	
    { {item}} -- { {index}}
    `

    页面展示的变化

    数组

    1. 使用数组的变更函数 push, pop, shift, unshift, splice, sort, reverse
    2. 直接替换数组
    this.listArray = ['bye', 'world'];
    this.listArray = ['bye'].concat(['world']);
    this.listArray = ['bye', 'world'].filter(item => item === 'bye');
    
    1. 直接更新数组的内容
    this.listArray[1] = 'hello';
    

    对象
    直接添加对象的内容,也可以自动的展示出来

    this.listObject.age = 18;
    

    直接循环数字

    template: `
    	
    { {item}}
    `
    // 会直接循环从 1 到 10 数字

    如果再循环的过程中想要加判断

    template: `
    	
    { {value}} -- {key}
    `

    如果不想要外层的 div,可以用占位符

    template: `
    	
    `;
    

    事件

    额外获取参数同时传递事件对象

    data() {
         
    	return {
         
    		counter: 0
    	}
    },
    methods: {
         
    	handleBtnClick(num, $event) {
         
    		this.counter += num;
    	}
    },
    template: '',
    

    事件执行多个函数

    template: `
    	
    `
    

    事件修饰符

    stop 阻止事件冒泡
    self 判断点击的为自己
    prevent 阻止默认行为
    capture 会把事件运营模式变成的捕获模式
    once 事件绑定只执行一次
    passive 在事件为 scroll 时,会提升性能

    template: `
    	
    `

    按键修饰符

    enter,tab,delete,esc,up,down,left,right

    template: `
    	
    `

    鼠标修饰符

    left,right,middle

    精确修饰符

    exact

    // 在按住 ctrl 并且没有按住其他键时,点击触发
    template: `
    	
    123
    `

    双向绑定

    1. input
    template: `
    	
    `
    1. textarea
    template: `