【三十天精通 Vue 3】 第四天 Vue 3的模板语法详解

在这里插入图片描述

✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: 三十天精通 Vue 3

文章目录

  • 引言
    • 一、Vue 3 模板语法概述
      • 1. Vue 3 模板语法的简介
      • 2. Vue 3 模板语法的基本语法
      • 3. Vue 3 模板语法的命名空间
      • 4. Vue 3 模板语法的指令
    • 二、 Vue 3 模板语法的应用场景
      • 1. 模板语法在单页应用中的应用
      • 2. 模板语法在组件化应用中的应用
      • 3. 模板语法在 Vue Router 中的应用
    • 三、 Vue 3 模板语法的细节处理
      • 1. Vue 3 模板语法中的计算属性和侦听器
      • 2. Vue 3 模板语法中的嵌套组件
      • 3. Vue 3 模板语法中的模板引用
      • 4. Vue 3 模板语法中的模板嵌套
    • 四、Vue 3 模板语法的高级特性
      • 1. Vue 3 模板语法的虚拟 DOM 操作
      • 2. Vue 3 模板语法的事件处理
      • 3. Vue 3 模板语法的响应式系统
      • 4. Vue 3 模板语法的插件系统
    • 五、Vue 3 模板语法的常见问题及解决方案
      • 1. Vue 3 模板语法中的类型检查问题
      • 2. Vue 3 模板语法中的命名冲突问题
      • 3. Vue 3 模板语法中的模板编译问题
      • 4. Vue 3 模板语法中的性能问题

引言

Vue 3 模板语法是 Vue 3 新引入的一种语法,它可以让我们更加方便地编写 Vue 应用程序。在 Vue 3 中,模板语法成为了组件编写的主要方式,取代了 Vue 2 中的指令式编程方式。今天将介绍 Vue 3 模板语法的概述、应用场景、细节处理、高级特性以及常见问题及解决方案。

一、Vue 3 模板语法概述

1. Vue 3 模板语法的简介

Vue 3 模板语法是一种用于创建 Vue 3 组件模板的语法。它允许开发者使用文本编辑器编写组件模板,并使用 Vue 3 的编译器将其转换为可执行代码。与 Vue 2 模板语法相比,Vue 3 模板语法更加灵活和强大,支持更高级的组件嵌套和动态数据绑定等功能。

2. Vue 3 模板语法的基本语法

Vue 3 模板语法的基本语法如下:

<template>  
  <div>  
    <!-- 组件内容 -->  
  </div>  
</template>  

其中,<template> 标签用于描述组件模板,<div> 标签用于创建组件的容器元素,<!-- 组件内容 --> 用于插入组件的具体内容。在模板中,可以使用命名空间、指令等高级特性来更好地支持组件嵌套和动态数据绑定等功能。

3. Vue 3 模板语法的命名空间

在 Vue 3 模板语法中,命名空间是非常重要的一个特性。命名空间允许开发者将组件模板中的部分元素转换为命名空间,以便更好地支持组件嵌套和动态数据绑定等功能。命名空间可以使用以下语法定义:

<template>  
  <div namespace="my-component">  
    <!-- 组件内容 -->  
  </div>  
</template>  

其中,<template> 标签中的 namespace 属性用于定义命名空间,<div> 标签中的 namespace 属性用于将命名空间与组件模板中的元素进行绑定。在组件实例中,可以使用 $namespace 方法访问命名空间,并使用其中的元素来创建动态组件等操作。

4. Vue 3 模板语法的指令

在 Vue 3 模板语法中,指令是一种非常强大的特性,它允许开发者在组件模板中使用 JavaScript 操作来动态地更新组件状态或创建动态组件等操作。指令可以使用以下语法定义:

<template>  
  <div>  
    <!-- 组件内容 -->  
  </div>  
</template>

<script>  
export default {  
  props: {  
    value: {  
      type: String,  
      default: ''  
    }  
  },  
  template: `<input v-model="value">`  
}
</script>  

其中,<template> 标签用于描述组件模板,<script> 标签用于定义组件脚本,export default 用于将组件导出为公共组件,props 用于定义组件属性,v-model 指令用于绑定输入框与 Vue 实例之间的双向数据绑定,template 指令用于将输入框的模板与 Vue 实例进行绑定。

二、 Vue 3 模板语法的应用场景

1. 模板语法在单页应用中的应用

在单页应用中,模板语法可以用于创建动态数据绑定的组件模板。例如,在一个单页应用中,可以使用模板语法创建计数器组件,该组件可以动态地更新计数器的值,并与页面中的其他组件进行数据绑定。

<template>  
  <div>  
    <!-- 计数器组件的具体内容 -->  
    <p v-if="count > 0">{{ count }}</p>  
  </div>  
</template>  

在上面的代码中,<template> 标签用于描述组件模板,<div> 标签用于创建组件的容器元素,<!-- 计数器组件的具体内容 --> 用于插入组件的具体内容。在模板中,可以使用 v-if 指令和 v-show 指令来动态地更新组件内容的显示或隐藏,以适应页面的需求。

2. 模板语法在组件化应用中的应用

在组件化应用中,模板语法可以用于创建嵌套组件模板。例如,在一个组件化应用中,可以使用模板语法创建一个简单的导航菜单组件,该组件可以嵌套在页面中的其他组件中,并使用 Vue 3 的指令和计算属性等技术进行动态更新和操作。

<template>  
  <div>  
    <!-- 导航菜单组件的具体内容 -->  
    <ul>  
      <li v-for="item in items" v-bind:key="item.id">  
        {{ item.text }}  
      </li>  
    </ul>  
  </div>  
</template>

<script>  
export default {  
  data() {  
    return {  
      items: [  
        { id: 1, text: '菜单 1' },  
        { id: 2, text: '菜单 2' },  
        { id: 3, text: '菜单 3' }  
      ]  
    };  
  },  
  template: `<ul v-for="item in items" v-bind:key="item.id">` +  
    `<li v-bind:key="item.id">{{ item.text }}</li>` +  
    `</ul>`  
};  
</script>  

在上面的代码中,<template> 标签用于描述组件模板,<div> 标签用于创建组件的容器元素,<!-- 导航菜单组件的具体内容 --> 用于插入组件的具体内容。在模板中,可以使用 Vue 3 的指令和计算属性等技术来动态地更新组件状态或创建动态组件等操作。

3. 模板语法在 Vue Router 中的应用

在 Vue Router 中,模板语法可以用于创建路由组件模板。例如,在一个 Vue Router 应用中,可以使用模板语法创建一个简单的登录表单组件,该组件可以嵌套在页面中的其他组件中,并使用 Vue 3 的指令和计算属性等技术进行动态更新和操作。

<template>  
  <div>  
    <!-- 登录表单组件的具体内容 -->  
    <form @submit.prevent="submitForm">  
      <input type="text" v-model="username" />  
      <input type="password" v-model="password" />  
      <button type="submit">登录</button>  
    </form>  
  </div>  
</template>

<script>  
export default {  
  data() {  
    return {  
      username: '',  
      password: ''  
    };  
  },  
  methods: {  
    submitForm() {  
      // 处理登录请求  
    }  
  }  
};  
</script>  

在上面的代码中,<template> 标签用于描述组件模板,<div> 标签用于创建组件的容器元素,<!-- 登录表单组件的具体内容 --> 用于插入组件的具体内容。在模板中,可以使用 Vue 3 的指令和计算属性等技术来动态地更新组件状态或创建动态组件等操作,以适应页面的需求。

三、 Vue 3 模板语法的细节处理

1. Vue 3 模板语法中的计算属性和侦听器

在 Vue 3 中,计算属性和侦听器仍然可以使用,但是需要注意一些细节。

  • 计算属性

在 Vue 3 中,计算属性的语法基本与 Vue 2 相同,但是需要注意使用 @Computed 修饰符。在计算属性中,需要使用 return 语句返回计算结果,同时在模板中使用 {{ }} 进行表达式渲染。

例如:

export default {  
  name: 'App',  
  components: {  
    HelloComponent,  
  },  
  data() {  
    return {  
      message: 'Hello Vue!',  
    };  
  },  
  @Computed('message')  
  get messageComputed() {  
    return this.message;  
  },  
};  
  • 侦听器

在 Vue 3 中,侦听器的语法也基本与 Vue 2 相同,但是需要注意使用 @Listen 修饰符。在侦听器中,需要使用 on 或者 @ on 进行事件监听,同时在模板中使用 {{ }} 进行表达式渲染。

例如:

export default {  
  name: 'App',  
  components: {  
    HelloComponent,  
  },  
  data() {  
    return {  
      message: 'Hello Vue!',  
    };  
  },  
  @Listen('message', ['update', 'set'])  
  onMessageUpdate(event) {  
    console.log(event.data);  
  },  
};  

2. Vue 3 模板语法中的嵌套组件

在 Vue 3 中,嵌套组件的使用变得更加简单,可以使用 ::before 和 ::after 进行组件嵌套。

例如:

<template>  
  <div>  
    <div :before="messageBefore"></div>  
    <child-component></child-component>  
    <div :after="messageAfter"></div>  
  </div>  
</template>

<script>  
import ChildComponent from './ChildComponent.vue';

export default {  
  name: 'App',  
  components: {  
    ChildComponent,  
  },  
  data() {  
    return {  
      messageBefore: 'Hello Vue!',  
      messageAfter: 'Hello Vue!',  
    };  
  },  
};  
</script>  

3. Vue 3 模板语法中的模板引用

在 Vue 3 中,模板引用的语法也有所改变。使用 ::slotted 修饰符可以引用模板中的子组件。

例如:

<template>  
  <div>  
    <div :slotted="message"></div>  
    <child-component></child-component>  
  </div>  
</template>

<script>  
import ChildComponent from './ChildComponent.vue';

export default {  
  name: 'App',  
  components: {  
    ChildComponent,  
  },  
  data() {  
    return {  
      message: 'Hello Vue!',  
    };  
  },  
};  
</script>  

4. Vue 3 模板语法中的模板嵌套

在 Vue 3 中,模板嵌套的语法也有所改变。使用 ::before 和 ::after 修饰符可以进行组件嵌套。

例如:

<template>  
  <div>  
    <div :before="messageBefore"></div>  
    <template :slotted="message"></template>  
    <div :after="messageAfter"></div>  
  </div>  
</template>

<script>  
import ChildComponent from './ChildComponent.vue';

export default {  
  name: 'App',  
  components: {  
    ChildComponent,  
  },  
  data() {  
    return {  
      messageBefore: 'Hello Vue!',  
      messageAfter: 'Hello Vue!',  
    };  
  },  
};  
</script>  

四、Vue 3 模板语法的高级特性

1. Vue 3 模板语法的虚拟 DOM 操作

在 Vue 3 中,模板语法可以通过 v-if、v-show、v-bind 等修饰符来进行虚拟 DOM 的操作。这些修饰符可以方便地实现模板中的条件渲染、动态渲染等操作。

例如:

<template>    
  <div v-if="show">    
    <p>Hello Vue!</p>    
  </div>    
  <div v-else-if="show2">    
    <p>Hello Vue 2!</p>    
  </div>    
</template>

<script>  
export default {  
  data() {  
    return {  
      show: false,  
      show2: false,  
    };  
  },  
};  
</script>  

在这个例子中,我们通过使用 v-if 和 v-else-if 修饰符来实现了两个 div 的渲染条件。当 show 为 true 时,show2 为 false,两个 div 都会被渲染;当 show 为 false 时,show2 为 true,只有 show 为 true 的 div 会被渲染。

2. Vue 3 模板语法的事件处理

在 Vue 3 中,模板语法可以通过 @click、@key、@input 等修饰符来触发事件处理函数。这些修饰符可以方便地实现点击事件、输入事件等操作。

例如:

<template>    
  <div @click="handleClick">    
    <p>Hello Vue!</p>    
  </div>    
</template>

<script>  
export default {  
  data() {  
    return {  
      handleClick: function() {  
        console.log('Hello Vue!');  
      },  
    };  
  },  
};  
</script>  

在这个例子中,我们通过使用 @click 修饰符来触发 handleClick 事件处理函数。当用户点击按钮时,该事件处理函数会被执行。

3. Vue 3 模板语法的响应式系统

在 Vue 3 中,模板语法可以通过 :value、@change 等修饰符来响应式数据。这些修饰符可以方便地实现输入框的值更新、下拉框的选择更新等操作。

例如:

<template>    
  <div @change="handleChange">    
    <input type="text" v-model="value">    
  </div>    
</template>

<script>  
export default {  
  data() {  
    return {  
      value: '',  
    };  
  },  
  methods: {  
    handleChange() {  
      this.value = this.$el.value;  
    },  
  },  
};  
</script>  

在这个例子中,我们通过使用 @change 修饰符来响应式地更新输入框的值。当用户输入文本时,该事件处理函数会被执行,并更新 this.value 的值。

4. Vue 3 模板语法的插件系统

在 Vue 3 中,模板语法可以通过 插件 来扩展组件的功能。

例如:

<template>    
  <div>    
    <button @click="handleClick">Click me</button>    
  </div>    
</template>

<script>  
import { ref } from 'vue';

export default {  
  setup() {  
    const button = ref('Button');

    function handleClick() {  
      console.log('Button clicked');  
    }

    return {  
      button,  
      handleClick,  
    };  
  },  
};  
</script>  

在这个例子中,我们通过使用 ref 修饰符来创建一个名为 button 的响应式对象。该对象包含了一个按钮的点击事件处理函数。同时,我们还定义了一个 handleClick 方法,该方法会被调用,当用户点击按钮时。通过使用 插件,我们可以方便地扩展组件的功能,提高组件的复用性。

五、Vue 3 模板语法的常见问题及解决方案

1. Vue 3 模板语法中的类型检查问题

在 Vue 3 中,模板语法的类型检查是由 Vue 的类型检查机制来管理的。由于 Vue 的类型检查机制是基于 JavaScript 的类型检查,因此可能会出现一些类型检查的问题。

一种类型检查的问题是由于模板中使用的变量或数据类型不正确,导致类型检查无法通过。为了避免这种情况,可以在模板中使用正确的数据类型或变量类型。

另一种类型检查的问题是由于模板中使用的修饰符或指令不正确,导致类型检查无法通过。例如,在使用 v-if 指令时,需要确保条件表达式是有效的 JavaScript 表达式。

解决方案:

  • 在模板中使用正确的数据类型或变量类型。
  • 确保模板中使用的修饰符或指令是有效的。

2. Vue 3 模板语法中的命名冲突问题

在 Vue 3 中,模板语法中的命名冲突问题可能是由于组件命名空间导致的。由于组件命名空间是自动生成的,因此可能会出现命名冲突。

一种命名冲突的情况是由于多个组件使用了相同的命名空间,导致组件无法正确渲染。另一种命名冲突的情况是由于组件使用了相同的变量名或命名空间,导致组件无法正确渲染。

解决方案:

  • 确保组件命名空间不同,避免出现命名冲突。
  • 使用变量名或命名空间时,尽可能使用不同的名称,以避免命名冲突。

3. Vue 3 模板语法中的模板编译问题

在 Vue 3 中,模板编译是由 Vue 的编译器来完成的。由于 Vue 的编译器是基于 JavaScript 的编译器,因此可能会出现一些模板编译的问题。

一种模板编译的问题是由于模板中使用的变量或数据类型不正确,导致模板编译无法通过。另一种模板编译的问题是由于模板中使用的修饰符或指令不正确,导致模板编译无法通过。

解决方案:

  • 在模板中使用正确的数据类型或变量类型。
  • 确保模板中使用的修饰符或指令是有效的。

4. Vue 3 模板语法中的性能问题

在 Vue 3 中,模板语法的性能问题可能是由于模板编译器的性能和解析速度导致的。由于 Vue 的编译器是基于 JavaScript 的编译器,因此编译时间较长,可能会导致模板语法的性能问题。

一种性能问题是由于模板中使用的变量或数据类型不正确,导致模板编译无法通过,从而影响组件的渲染性能。另一种性能问题是由于模板中使用的修饰符或指令不正确,导致模板编译无法通过,从而影响组件的渲染性能。

解决方案:

  • 在模板中使用正确的数据类型或变量类型。
  • 确保模板中使用的修饰符或指令是有效的,尽可能减少模板编译的时间。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/10298.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Openlayers(五)点位聚合Cluster

Openlayers&#xff08;五&#xff09;点位聚合Cluster 1.业务问题 由于点位在地图上显示过多&#xff0c;会造成页面卡顿、点位标注信息相互叠加导致看不清 优化后效果 不断放大层级 2.聚合类Cluster OpenLayers 中聚合是通过 ol.source.Cluster 实现&#xff0c;聚合的原…

Flink的窗口机制

窗口机制 tumble&#xff08;滚动窗口&#xff09; hop&#xff08;滑动窗口&#xff09; session&#xff08;会话窗口&#xff09; cumulate&#xff08;渐进式窗口&#xff09; Over&#xff08;聚合窗口&#xff09; 滚动窗口&#xff08;tumble&#xff09; 概念 滚…

系统复杂度之【高性能】

系统复杂度之【高性能】 今天我们来谈一谈系统复杂度的根源之【高性能】 对性能的不懈追求一直是人类科技持续发展的核心动力。例如计算机&#xff0c;从电子管计算机到晶体管计算机&#xff0c;再到集成电路计算机&#xff0c;运算性能从每秒几次提高到每秒几亿次。然而&#…

VUE_学习笔记

一、 xx 二、模板语法 1.模板语法之差值语法 &#xff1a;{{ }} 主要研究&#xff1a;{{ 这里可以写什么}} 在data中声明的变量、函数等都可以。常量只要是合法的javascript表达式&#xff0c;都可以。模板表达式都被放在沙盒中&#xff0c;只能访问全局变量的一个白名单&a…

【微服务笔记14】微服务组件之Config配置中心高可用环境搭建

这篇文章&#xff0c;主要介绍微服务组件之Config配置中心高可用环境搭建。 目录 一、高可用Config配置中心 1.1、高可用配置中心介绍 1.2、搭建Eureka注册中心 1.3、搭建ConfigServer服务端 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;添加配置文件 …

Jetson nano部署剪枝YOLOv8

目录前言一、YOLOv8模型剪枝训练1. Pretrain[option]1.1 项目的克隆1.2 数据集1.3 训练2. Constraint training3. Prune4. finetune二、YOLOv8模型剪枝部署1. 源码下载2. 环境配置2.1 trtexec环境变量设置3. ONNX导出3.1 Transpose节点的添加3.2 Resize节点解析的问题4. 运行4.…

FIFO的工作原理及其设计

1.简介 FIFO( First Input First Output)简单说就是指先进先出。FIFO存储器是一个先入先出的双口缓冲器&#xff0c;即第一个进入其内的数据第一个被移出&#xff0c;其中一个口是存储器的输入口&#xff0c;另一个口是存储器的输出口。 对于单片FIFO来说&#xff0c;主要有两种…

SHELL函数可课后作业

一、题目 1、编写函数&#xff0c;实现打印绿色OK和红色FAILED 判断是否有参数&#xff0c;存在为Ok&#xff0c;不存在为FAILED 2、编写函数&#xff0c;实现判断是否无位置参数&#xff0c;如无参数&#xff0c;提示错误 3、编写函数实现两个数字做为参数&#xff0c;返回最…

多线程 之 CAS与synchronized的优化过程

前言 本篇介绍什么是CAS与synchronized的优化过程&#xff0c;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&#xff01; 文章目录前言1. 什么是CAS&#xff1f;2. CAS实现的操作2.1 实现原子类2.2 实现自旋锁3. CAS的aba问题4. synchr…

【无人机】基于灰狼优化算法的无人机路径规划问题研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

链式二叉树及相关操作(前,中,后,层序遍历)

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; “春来无事&#xff0c;只为花忙。” 前言: 上一期给大家介绍了二叉树的一种顺序结构&#xff1a;堆&#xff0c;这一期承接上一期&#xff0c;给大家继续介绍二叉树的另一种结构&#xff1a;链式结构。 目录…

golang指针相关

指针相关的部分实在是没有搞太明白&#xff0c;抽时间来总结下。 1.指针相关基础知识 比如现在有一句话&#xff1a;『谜底666』&#xff0c;这句话在程序中一启动&#xff0c;就要加载到内存中&#xff0c;假如内存地址0x123456&#xff0c;然后我们可以将这句话复制给变量A&…

多线程(八):常见锁策略

目录 前言 1. 乐观锁 VS 悲观锁 乐观锁 悲观锁 2. 轻量级锁 VS 重量级锁 轻量级锁 3. 自旋锁 VS 挂起等待锁 自旋锁 挂起等待锁 4. 读写锁 VS 互斥锁 5. 可重入锁 vs 不可重入锁 死锁 发生死锁的情况 死锁产生的四个必要条件如下&#xff1a; 6. 公平锁和非公平锁…

【Java EE】-多线程编程(九) 锁策略CAS锁优化

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【JavaEE】 分享&#xff1a; 主要内容&#xff1a;乐观锁VS悲观锁、轻量级锁VS重量级锁、自旋锁VS挂起等待锁、互斥锁VS读写锁、公平锁VS非公平锁、可重入锁VS不可重入锁。CAS实…

Python数据结构与算法-树

一、树的概念详情见 https://blog.csdn.net/little_limin/article/details/129845592 Python数据结构与算法-堆排序&#xff08;NB组&#xff09;—— 一、树的基础知识二、树的实例&#xff1a;模拟文件系统1、树的存储树结构也是链式存储的&#xff0c;与链表的结构相似&…

类ChatGPT代码级解读:如何从零起步实现Transformer、llama/ChatGLM

前言 最近一直在做类ChatGPT项目的部署 微调&#xff0c;关注比较多的是两个&#xff1a;一个LLaMA&#xff0c;一个ChatGLM&#xff0c;会发现有不少模型是基于这两个模型去做微调的&#xff0c;说到微调&#xff0c;那具体怎么微调呢&#xff0c;因此又详细了解了一下微调代…

Vulnhub_Pylington

目录 一、信息收集 &#xff08;一&#xff09;端口服务探测 &#xff08;二&#xff09;目录扫描 二、漏洞挖掘 &#xff08;一&#xff09;robots敏感信息泄露 &#xff08;二&#xff09;python IDE沙箱绕过RCE 1. python敏感函数沙盒绕过 2. exec(__import_…

【ES】搜索结果处理RestClient查询文档

【ES】搜索结果处理&RestClient查询文档2.搜索结果处理2.1.排序2.1.1.普通字段排序2.1.2.地理坐标排序2.2.分页2.2.1.基本的分页2.2.2.深度分页问题2.2.3.小结2.3.高亮2.3.1.高亮原理2.3.2.实现高亮2.4.总结3.RestClient查询文档3.1.快速入门3.1.1.发起查询请求3.1.2.解析响…

Python做个猫狗识别系统,给人美心善的邻居

嗨害大家好鸭&#xff01;我是爱摸鱼的芝士❤ 宠物真的看着好治愈 谁不想有一只属于自己的乖乖宠物捏~ 这篇文章中我放弃了以往的model.fit()训练方法&#xff0c; 改用model.train_on_batch方法。 两种方法的比较&#xff1a; model.fit()&#xff1a;用起来十分简单&#…

Kubernetes 部署 StarRocks 集群

文章目录StarRocks简介系统架构图安装部署StarRocks手动部署通过 Docker部署使用 StarGo 部署管理通过 StarRocks Manager部署管理通过 Kubernetes部署工作原理逻辑图部署 StarRocks Operator部署 StarRocks 集群访问 StarRocks 集群集群内访问 StarRocks 集群集群外访问 StarR…