通过AI技术优化数学建模论文复现流程:9种方案与10款工具推荐
一�watch 基本概念�用法
1 æ ¸å¿ƒæ¦‚å¿µwatch 是 Vue 3 ä¸ç”¨äº�监å�¬ç‰¹å®šæ•°æ�®æº�å�˜åŒ–并执行副作用的 API。它默认是惰性的å�ªæœ‰å½“监å�¬çš„æº�å�‘生å�˜åŒ–æ—¶æ‰�会触å�‘å›�调函数。这使得 watch é��常适å�ˆå¤„ç�†é‚£äº›éœ€è¦�在特定状æ€�å�˜åŒ–æ—¶æ‰§è¡Œçš„å¼‚æ¥æ“�作或å¤�æ�‚逻辑。
2 基本用法示例Options API æ–¹å¼�export default { data() { return { question: , answer: Questions usually contain a question mark. ;-), loading: false } }, watch: { // 当 question å�˜åŒ–时执行æ¤å‡½æ•° question(newQuestion, oldQuestion) { if (newQuestion.includes(?)) { this.getAnswer() } } }, methods: { async getAnswer() { this.loading true this.answer Thinking... try { const res await fetch(https://yesno.wtf/api) this.answer (await res.json()).answer } catch (error) { this.answer Error! Could not reach the API. error } finally { this.loading false } } } }Composition API æ–¹å¼�script setup import { ref, watch } from vue const question ref() const answer ref(Questions usually contain a question mark. ;-)) const loading ref(false) // ç›´æ�¥ç›‘å�¬ ref watch(question, async (newQuestion, oldQuestion) { if (newQuestion.includes(?)) { loading.value true answer.value Thinking... try { const res await fetch(https://yesno.wtf/api) answer.value (await res.json()).answer } catch (error) { answer.value Error! Could not reach the API. error } finally { loading.value false } } }) /script template p Ask a yes/no question: input v-modelquestion :disabledloading / /p p/p /template
3 高级用法监�嵌套�性// Options API export default { watch: { some.nested.key(newValue) { // 当嵌套�性�化时触� } } } // Composition API const obj reactive({ some: { nested: { key: 0 } } }) watch( () obj.some.nested.key, (newValue) { // 当嵌套�性�化时触� } )深度监�// Options API export default { watch: { someObject: { handler(newValue, oldValue) { // 监�对象的所有嵌套�性�化 }, deep: true } } } // Composition API const obj reactive({ count: 0 }) // 直�监� reactive 对象会自动创建深度监� watch(obj, (newValue, oldValue) { // 当对象的任何嵌套�性�化时触� })立�执行// Options API export default { watch: { question: { handler(newQuestion) { // 组件创建时立�执行一次 }, immediate: true } } } // Composition API watch( question, (newQuestion) { // 组件创建时立�执行一次 }, { immediate: true } )二�watchEffect 基本概念�用法
1 æ ¸å¿ƒæ¦‚å¿µwatchEffect 是 Vue 3 ä¸å�¦ä¸€ä¸ªå¼ºå¤§çš„侦å�¬å™¨ API它会自动收集å›�调函数ä¸çš„ä¾�赖并在ä¾�èµ–å�‘生å�˜åŒ–æ—¶é‡�新执行å›�调。ä¸� watch ä¸�å�ŒwatchEffect 会在组件创建时立å�³æ‰§è¡Œä¸€æ¬¡ç„¶å��在ä¾�èµ–å�˜åŒ–æ—¶å†�次执行。
2 基本用法示例script setup import { ref, watchEffect } from vue const todoId ref(
const data ref(null) // 自动收集 todoId.value 作为�赖 watchEffect(async () { const response await fetch( https://jsonplaceholder.typicode.com/todos/${todoId.value} ) data.value await response.json() }) /script
3 高级用法副作用清ç�†watchEffect((onCleanup) { const controller new AbortController() fetch(/api/${id.value}, { signal: controller.signal }) .then(response response.json()) .then(data { // 处ç�†æ•°æ�® }) // 当ä¾�èµ–å�˜åŒ–时先执行清ç�†å‡½æ•° onCleanup(() { controller.abort() }) })调整执行时机// 默认在组件更新å‰�执行 watchEffect(() {}) // 在组件更新å��执行 watchEffect(() {}, { flush: post }) // 或使用别å�� watchPostEffect(() {}) // å�Œæ¥æ‰§è¡Œä¸�进行批处ç�† watchEffect(() {}, { flush: sync }) // 或使用别å�� watchSyncEffect(() {})三ã€�watch ä¸� watchEffect 对比选å�‹
1 æ ¸å¿ƒåŒºåˆ«å¯¹æ¯”ç‰¹æ€§watchwatchEffectä¾�赖追踪手动指定监å�¬æº�自动收集å›�è°ƒä¸çš„ä¾�赖执行时机惰性执行仅在æº�å�˜åŒ–时触å�‘ç«‹å�³æ‰§è¡Œç„¶å��在ä¾�èµ–å�˜åŒ–时触å�‘å�‚æ•°è�·å�–å�¯ä»¥è�·å�–æ–°æ—§å€¼æ— æ³•ç›´æ�¥è�·å�–新旧值使用场景监å�¬ç‰¹å®šæ•°æ�®æº�需è¦�è�·å�–新旧值监å�¬å¤šä¸ªä¾�èµ–ä¸�需è¦�关心具体哪个ä¾�èµ–å�˜åŒ–
2 工作�程对比
3 选å�‹å»ºè®®ä½¿ç”¨ watch 的场景需è¦�监å�¬ç‰¹å®šçš„æ•°æ�®æº�å�˜åŒ–需è¦�è�·å�–å�˜åŒ–å‰�å��的具体值需è¦�执行惰性æ“�作仅在æº�å�˜åŒ–时执行需è¦�深度监å�¬æˆ–ç«‹å�³æ‰§è¡Œç‰é«˜çº§é…�置使用 watchEffect 的场景需è¦�监å�¬å¤šä¸ªä¾�赖且ä¸�关心具体哪个ä¾�èµ–å�˜åŒ–需è¦�在组件创建时立å�³æ‰§è¡Œä¸€æ¬¡éœ€è¦�自动管ç�†ä¾�èµ–å‡�少代ç �维护æˆ�本处ç�†å¼‚æ¥æ“�作时需è¦�自动清ç�†å‰¯ä½œç”¨å››ã€�性能优化技巧
1 ���必�的监��监��际需�的数����监�整个大对象使用 getter 函数监�嵌套�性而�是使用 deep 选项对��需�深度监�的对象��使用 deep: true
2 å�ˆç�†ä½¿ç”¨æ¸…ç�†å‡½æ•°åœ¨å¤„ç�†å¼‚æ¥æ“�作时务必使用清ç�†å‡½æ•°å�–消未完æˆ�的请求é�¿å…�å†…å˜æ³„æ¼�å�Šæ—¶æ¸…ç�†å®šæ—¶å™¨ã€�事件监å�¬å™¨ç‰èµ„æº�
3 ä¼˜åŒ–æ‰§è¡Œæ—¶æœºæ ¹æ�®å®�际需求选择å�ˆé€‚çš„ flush 选项对äº�ä¸�需è¦�ç«‹å�³æ‰§è¡Œçš„æ“�作使用默认的 pre 时机对äº�需è¦�访问更新å�� DOM çš„æ“�作使用 post 时机
4 é�¿å…�在侦å�¬å™¨ä¸æ‰§è¡Œæ˜‚è´µæ“�作将å¤�æ�‚计算逻辑æ��å�–到计算å±�性ä¸å¯¹äº�需è¦�频ç¹�执行的æ“�作考虑使用防抖或节æµ�五ã€�课å�� Quiz问题 1在 Vue 3 ä¸watch å’Œ watchEffect 的主è¦�区别是什么请至少列举 3 ç‚¹ã€‚ç”æ¡ˆè§£æ��ä¾�赖追踪方å¼�watch 需è¦�手动指定监å�¬æº�而 watchEffect 会自动收集å›�è°ƒä¸çš„ä¾�赖。执行时机watch 默认是惰性的å�ªæœ‰å½“监å�¬æº�å�˜åŒ–æ—¶æ‰�会触å�‘而 watchEffect 会在组件创建时立å�³æ‰§è¡Œä¸€æ¬¡ç„¶å��在ä¾�èµ–å�˜åŒ–æ—¶å†�次执行。问题 2如何在 watchEffect ä¸å¤„ç�†å¼‚æ¥æ“�作的副作用清ç�†è¯·ç»™å‡ºä»£ç �ç¤ºä¾‹ã€‚ç”æ¡ˆè§£æ��å�¯ä»¥ä½¿ç”¨ watchEffect å›�调函数的第一个å�‚æ•° onCleanup æ�¥æ³¨å†Œæ¸…ç�†å‡½æ•°watchEffect((onCleanup) { const controller new AbortController() fetch(/api/data, { signal: controller.signal }) .then(response response.json()) .then(data { // 处ç�†æ•°æ�® }) // 当ä¾�èµ–å�˜åŒ–æ—¶å…ˆæ‰§è¡Œæ¤æ¸…ç�†å‡½æ•° onCleanup(() { controller.abort() // å�–消未完æˆ�的请求 }) })这个清ç�†å‡½æ•°ä¼šåœ¨ watchEffect é‡�新执行å‰�被调用确ä¿�之å‰�çš„å¼‚æ¥æ“�作被æ£ç¡®å�–消é�¿å…�ä¸�å¿…è¦�的资æº�消耗和潜在的错误。å…ã€�常è§�报错解决方案错误 1watch 监å�¬ reactive 对象å±�æ€§æ—¶æ— å��应错误表ç�°const obj reactive({ count: 0 }) // æ¤ä»£ç �ä¸�会生效 watch(obj.count, (newValue) { console.log(count changed:, newValue) })å�Ÿå› 分æ��watch æ— æ³•ç›´æ�¥ç›‘å�¬ reactive 对象的å±�性需è¦�使用 getter 函数。解决åŠ�法watch( () obj.count, (newValue) { console.log(count changed:, newValue) } )错误 2watchEffect æ— æ³•æ£ç¡®è¿½è¸ªå¼‚æ¥æ“�作ä¸çš„ä¾�赖错误表ç�°watchEffect(async () { const data await fetchData() // æ¤å¤„çš„ä¾�èµ–ä¸�会被æ£ç¡®è¿½è¸ª console.log(user.value.name) })å�Ÿå› 分æ��watchEffect å�ªåœ¨å�Œæ¥æ‰§è¡Œé˜¶æ®µæ”¶é›†ä¾�èµ–å¼‚æ¥æ“�作ä¸çš„ä¾�èµ–ä¸�会被追踪。解决åŠ�法watchEffect(() { // 在å�Œæ¥é˜¶æ®µè®¿é—®ä¾�èµ– const userId user.value.id async function fetchData() { const data await fetch(/api/user/${userId}) // 处ç�†æ•°æ�® } fetchData() })错误 3å†…å˜æ³„æ¼�问题错误表ç�°åœ¨ç»„ä»¶å�¸è½½å��watch 或 watchEffect ä»�ç„¶åœ¨æ‰§è¡Œå¯¼è‡´å†…å˜æ³„æ¼�。å�Ÿå› 分æ��异æ¥åˆ›å»ºçš„侦å�¬å™¨ä¸�会自动ä¸�组件绑定需è¦�手动å�œæ¢ã€‚解决åŠ�法// 手动å�œæ¢ä¾¦å�¬å™¨ const unwatch watchEffect(() { // 侦å�¬é€»è¾‘ }) // 在组件å�¸è½½æ—¶å�œæ¢ onUnmounted(() { unwatch() })
日本人的插曲视频-日本人的插曲视频应用