undefined
、null
、boolean
、number
、string
、symbol
(ES6 引入)和 bigint
(ES11 引入)。let num = 10; // number
let str = "Hello"; // string
let isTrue = true; // boolean
let nothing = null; // null
let notDefined; // undefined
let sym = Symbol(); // symbol
let bigInt = BigInt(123); // bigint
function outer() {
let count = 0;
return function inner() {
count++;
console.log(count);
};
}
const increment = outer();
increment(); // 1
increment(); // 2
__proto__
属性,指向其构造函数的原型。function Person(name) {
this.name = name;
}
Person.prototype.greet = function() {
console.log(`Hello, my name is ${this.name}`);
};
const john = new Person('John');
john.greet(); // Hello, my name is John
this
是什么?this
是一个动态绑定的关键字,指向函数执行时的上下文。它的值取决于调用函数的方式。const obj = {
name: 'Alice',
greet() {
console.log(`Hello, ${this.name}`);
}
};
obj.greet(); // Hello, Alice
const greetFunc = obj.greet;
greetFunc(); // Hello, undefined (在非严格模式下)
==
和 ===
的区别。==
是宽松比较,会进行类型转换;===
是严格比较,不会进行类型转换。console.log(0 == '0'); // true
console.log(0 === '0'); // false
pending
(进行中)、fulfilled
(已完成)、rejected
(已失败)。const fetchData = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Data fetched!');
}, 1000);
});
};
fetchData().then(data => console.log(data)); // 1秒后输出 "Data fetched!"
async/await
是基于 Promise 的语法糖,使异步代码看起来更像同步代码。async
声明一个异步函数,await
用于等待 Promise 完成。const fetchData = () => {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Data fetched!');
}, 1000);
});
};
const fetchAsyncData = async () => {
const data = await fetchData();
console.log(data);
};
fetchAsyncData(); // 1秒后输出 "Data fetched!"
addEventListener
的第三个参数控制。<div id="parent">
<button id="child">Click me</button>
</div>
<script>
const parent = document.getElementById('parent');
const child = document.getElementById('child');
parent.addEventListener('click', () => {
console.log('Parent clicked');
}, false); // false 为冒泡,true 为捕获
child.addEventListener('click', () => {
console.log('Child clicked');
}, false);
</script>
说明:节流是指某个函数在一定时间内只能执行一次;防抖是指在事件触发后等待一段时间,如果在这段时间内又触发了事件,则重新计时。
示例(节流):
function throttle(fn, delay) {
let lastTime = 0;
return function(...args) {
const now = Date.now();
if (now - lastTime > delay) {
lastTime = now;
fn.apply(this, args);
}
};
}
示例(防抖):
function debounce(fn, delay) {
let timer;
return function(...args) {
clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(this, args);
}, delay);
};
}
示例(浅拷贝):
const original = { a: 1, b: { c: 2 } };
const shallowCopy = Object.assign({}, original);
shallowCopy.b.c = 3;
console.log(original.b.c); // 3 (原对象也受到影响)
示例(深拷贝):
const original = { a: 1, b: { c: 2 } };
const deepCopy = JSON.parse(JSON.stringify(original));
deepCopy.b.c = 3;
console.log(original.b.c); // 2 (原对象没有受到影响)
new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
});
new Vue({
data() {
return {
message: 'Hello!'
};
},
created() {
console.log('组件创建时调用');
},
mounted() {
console.log('组件挂载后调用');
},
destroyed() {
console.log('组件销毁前调用');
}
});
Vue.component()
或单文件组件(.vue 文件)来定义。Vue.component('my-component', {
template: '<div>A custom component!</div>'
});
v-model
指令实现双向绑定。<div id="app">
<input v-model="inputValue">
<p>{{ inputValue }}</p> <!-- 实时显示输入的内容 -->
</div>
<script>
new Vue({
el: '#app',
data() {
return {
inputValue: ''
};
}
});
</script>
new Vue({
el: '#app',
data() {
return {
number: 1
};
},
computed: {
double() {
return this.number * 2; // 计算属性
}
},
methods: {
doubleMethod() {
return this.number * 2; // 方法
}
}
});
v-if
、v-for
、v-show
等。<div id="app">
<p v-if="isVisible">这个段落是可见的</p>
<button @click="toggleVisibility">切换可见性</button>
</div>
<script>
new Vue({
el: '#app',
data() {
return {
isVisible: true
};
},
methods: {
toggleVisibility() {
this.isVisible = !this.isVisible; // 切换可见性
}
}
});
</script>
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment(state) {
state.count++;
}
}
});
new Vue({
el: '#app',
store,
computed: {
count() {
return this.$store.state.count; // 获取状态
}
},
methods: {
increment() {
this.$store.commit('increment'); // 提交变更
}
}
});
const router = new VueRouter({
routes: [
{ path: '/home', component: HomeComponent },
{ path: '/about', component: AboutComponent }
]
});
new Vue({
el: '#app',
router
});
Vue.filter('capitalize', function(value) {
if (!value) return '';
return value.charAt(0).toUpperCase() + value.slice(1);
});
new Vue({
el: '#app',
data() {
return {
message: 'hello'
};
}
});
// 使用 Nuxt.js
export default {
asyncData(context) {
return context.$axios.$get('/api/data').then(data => {
return { data };
});
}
};
Object.defineProperty
实现响应式,主要通过 getter/setter 劫持对象属性。而 Vue 3 则使用 Proxy API,实现更加高效和灵活的响应式系统。const vm = new Vue({
data: {
message: 'Hello'
}
});
vm.message = 'World'; // 会触发视图更新
const { reactive } = Vue;
const state = reactive({
message: 'Hello'
});
state.message = 'World'; // 会触发视图更新
// Vue 2
export default {
data() {
return { count: 0 };
},
methods: {
increment() {
this.count++;
}
}
};
// Vue 3
import { ref } from 'vue';
export default {
setup() {
const count = ref(0);
const increment = () => count.value++;
return { count, increment };
}
};
import { defineComponent } from 'vue';
export default defineComponent({
setup() {
return () => <div>Hello, Vue 3!</div>;
}
});
$set
和 Vue 3 中的反应性系统如何处理新增属性?说明:在 Vue 2 中,添加新属性需要使用 $set
方法才能使其响应式;而在 Vue 3 中,使用 Proxy 后,新增属性会自动变为响应式。
示例(Vue 2):
const vm = new Vue({
data: {
obj: {}
}
});
Vue.set(vm.obj, 'newProp', 'value'); // 新增属性使其响应式
示例(Vue 3):
const { reactive } = Vue;
const state = reactive({ obj: {} });
state.obj.newProp = 'value'; // 新增属性自动响应
说明:在 Vue 2 中使用 v-on
监听事件,而在 Vue 3 中可以使用 @
符号简化语法。
示例(Vue 2):
<button v-on:click="handleClick">Click me</button>
示例(Vue 3):
<button @click="handleClick">Click me</button>
<template>
<teleport to="body">
<div class="modal">这是一个模态框</div>
</teleport>
</template>
v-model
有哪些变化?说明:Vue 3 中的 v-model
允许更灵活的使用,支持多个 v-model
和自定义 modelValue
属性。
示例:
<input v-model="message" />
示例(多个 v-model):
<MyComponent v-model:title="title" v-model:content="content" />
Suspense
组件有什么用途?Suspense
组件用于处理异步组件的加载状态,提供 fallback 内容直到异步组件加载完成。<suspense>
<template #default>
<AsyncComponent />
</template>
<template #fallback>
<div>Loading...</div>
</template>
</suspense>
provide/inject
是如何工作的?provide/inject
允许父组件向其所有子组件提供数据,而不需要通过 props 层层传递。// 父组件
import { provide } from 'vue';
export default {
setup() {
provide('key', 'value');
}
};
// 子组件
import { inject } from 'vue';
export default {
setup() {
const value = inject('key');
console.log(value); // 'value'
}
};
说明:Vue 2 中使用全局的 errorHandler
和组件内的 errorCaptured
;而 Vue 3 采用了新的 API,可以在 setup
中使用 onErrorCaptured
。
示例(Vue 2):
Vue.config.errorHandler = (err, vm) => {
console.error(err);
};
示例(Vue 3):
import { onErrorCaptured } from 'vue';
setup() {
onErrorCaptured((err) => {
console.error(err);
return false; // 继续传播
});
}
setState
来更新 UI。ListView
中保持元素顺序不变。async
和 await
处理异步函数。Future
来表示异步操作的结果。Stream
来处理一系列的异步事件,例如流式数据。Navigator.push()
和 Navigator.pop()
方法进行页面间的跳转和返回。MaterialPageRoute
或自定义的 PageRoute
实现页面动画。onGenerateRoute
或 Navigator 2.0
实现复杂的路由管理。Future
数据的 Widget,适合一次性异步数据获取。build()
方法中执行繁重的计算。const
构建不可变的 Widget。ListView.builder
等延迟加载的列表控件。RepaintBoundary
降低不必要的重绘。http
包进行网络请求。以下是一个简单的网络请求示例: import 'package:http/http.dart' as http;
import 'dart:convert';
Future<void> fetchData() async {
final response = await http.get(Uri.parse('https://api.example.com/data'));
if (response.statusCode == 200) {
var data = jsonDecode(response.body);
print(data);
} else {
throw Exception('Failed to load data');
}
}
AnimatedContainer
、AnimatedOpacity
等简化常见动画效果的实现。flutter_localizations
包来支持国际化。主要步骤包括:
pubspec.yaml
中添加依赖: dependencies:
flutter_localizations:
sdk: flutter
Intl
包来管理翻译文件。MaterialApp
中配置 localizationsDelegates
和 supportedLocales
。SliverList
、SliverGrid
、SliverAppBar
等。MethodChannel
实现 Flutter 与原生代码的双向通信。因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务