vuejs2 相关问题

将此标记用于特定于Vue.js版本2的问题,这是一个用于构建用户界面的开源,渐进式Javascript框架。

在另一个道具的验证器中访问道具值

我想访问另一个 props 验证器中的 props 值: 道具: { 类型: { 类型:字符串, 默认值:“标准” }, 尺寸: { 类型:字符串, 默认值:“正常”, 验证器(值...

回答 4 投票 0

如何在vue中访问子引用

我如何访问作为另一个 $refs 的子级的 $refs? 就像我的代码看起来像这样,我想要的是能够使用与我尝试过的语法类似的语法访问引用“ipsum”。的c...

回答 1 投票 0

如何在 vue 中的多个元素上使用 refs?

如何在 vue 组件中使用 refs(最好是在循环中)来操作模板中的多个 dom 元素?举例来说,我想在每个 上应用带有 GSAP 的动画 如何在我的 vue 组件中(最好是在循环中)使用 refs 来操作模板中的多个 dom 元素?举例来说,我想在函数中的每个 <p ref="pre"> 上应用带有 GSAP 的动画。我该怎么做?就像我会以数组或其他方式访问它们吗?当前代码仅适用于第一个元素,对吗? 我的模板 <template> <section ref="sectionText"> <p ref="pre"> text </p> </section> <section ref="sectionImage"> <p ref="pre"> some more text </p> </section> <section ref="sectionAudio"> <p ref="pre"> even more </p> </section> <section ref="sectionVideo"> <p ref="pre"> text </p> </section> </template> 我的组件 <script> import gsap from 'gsap' export default { mounted() { gsap.to(this.$refs.pre, 0.75, { opacity: 0 }) } } </script> 这种方法确保您可以在循环中使用 refs 将动画应用到多个 DOM 元素。 <template> <section ref="sectionText"> <p ref="setRef"> text </p> </section> <section ref="sectionImage"> <p ref="setRef"> some more text </p> </section> <section ref="sectionAudio"> <p ref="setRef"> even more </p> </section> <section ref="sectionVideo"> <p ref="setRef"> text </p> </section> </template> <script> import { gsap } from 'gsap'; export default { data() { return { preRefs: [] }; }, methods: { setRef(el) { if (el) { this.preRefs.push(el); } } }, mounted() { this.preRefs.forEach((pre) => { gsap.to(pre, 0.75, { opacity: 0 }); }); } } </script>

回答 1 投票 0

如何在VueJS中重新挂载组件?

我有一个组件作为 DOM 渲染的一部分安装。该应用程序的骨架是 我有一个作为 DOM 渲染的一部分安装的组件。该应用程序的骨架是 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>title</title> </head> <body> <div id="app"> <my-component></my-component> <button>press this button to reload the component</button> </div> </body> </html> <my-component> 具有功能(它显示一些表单输入)并且 $emit 向父级提供数据。 有办法重新安装它吗?目标是拥有组件内容和设置,就好像它刚刚第一次渲染一样(包括重置保持其状态的data()元素)。 对此有一些解决方案,但它们都假设重写data(),我想避免这种情况。 我的理解是,组件实际上是在渲染过程中在正确位置注入 dom 中的 HTML/CSS/JS 代码,所以我担心“重新安装”它的概念不存在 - 我只是想在之前确定一下采用 data() 重写方式。 诀窍是改变密钥 当 key 发生变化时,vue 会将其视为新组件,因此会卸载“旧”组件,并挂载“新”组件。 参见示例,created()挂钩只会运行一次,因此如果您看到值发生变化,您就会看到一个全新的对象。 示例: Vue.component('my-component', { template: `<div>{{ rand }}</div>`, data() { return { remount: true } }, created() { this.remount = !this.remount; // true▶false▶true▶false... } }); new Vue({ el: '#app', data: { componentKey:0 } }) <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.8/vue.min.js"></script> <div id="app"> <my-component :key="componentKey"></my-component> <button @click="componentKey=!componentKey">press this button to reload the component</button> </div> 在模板中,您将添加 v-if 指令: <template> <my-component v-if="renderComponent" /> </template> 在您的脚本中,您将添加使用 nextTick: 的方法 <script> export default { data() { return { renderComponent: true, }; }, methods: { forceRerender() { // Remove my-component from the DOM this.renderComponent = false; this.$nextTick(() => { // Add the component back in this.renderComponent = true; }); } } }; </script> 这就是这里发生的事情: 最初 renderComponent 设置为 true,因此渲染 my-component 当我们调用 forceRerender 时,我们立即将 renderComponent 设置为 false 我们停止渲染 my-component,因为 v-if 指令现在计算为 false 在下一个刻度上 renderComponent 设置回 true 现在 v-if 指令的计算结果为 true,因此我们再次开始渲染 my-component 可能来源:https://medium.com/hackernoon/the- Correct-way-to-force-vue-to-re-render-a-component-bde2caae34ad,最初发布于https://michaelnthiessen。 com/force-re-render/ .

回答 2 投票 0

将数据从 Rails 模板传递到 Vue 实例

我一直在尝试将数据从 Rails 视图传递到 Vue 组件,如此处所述 一切都按预期进行,但我对如何访问通过

回答 1 投票 0

Vuex 和 Vue Router - beforeEnter 上的双重条件不起作用

我在 beforeEnter 中有双重条件,没有人可以进入正确的位置。有条件限制什么的吗? :( 我在路由器文件中的代码: 常量路由 = { 路径:`${routerConfig.preRoute}/

回答 1 投票 0

Jest 和 Vue 测试 Computed 中的 UseHead

尝试在计算内部的组件中测试 UseHead,但它抛出以下错误无法读取未定义的属性(读取“名称”) Vue 组件有 useHead(计算(() ...

回答 1 投票 0

Chrome Core 在 IOS 浏览器中出现长按 UI 错误

我从另一个H5页面使用iframe打开一个H5页面,当我使用IOS Edge或IOS Chrome并在任何地方长按页面时,页面内容将被重置(我使用vue.js构建页面)。就像数据重置一样当长

回答 1 投票 0

Vue2 和 Vue3 在同一个网页上

出于一个非常利基和特定的原因,我需要 VueJS 的两个主要版本(2 和 3)在同一个网页上同时运行,并且每个版本彼此独立地运行自己的插件。这一切都会

回答 1 投票 0

Vue:如何在按钮单击时调用 .focus()

我昨天才开始使用 vue.js 编码,我不知道如何在不使用“传统”JS 方式 document.getElementById('myTextBox').focus() 的情况下“聚焦”文本框。 最初,我的

回答 4 投票 0

http://localhost:8000/broadcasting/auth 404(未找到)

我正在尝试让我的应用程序连接到私人频道上的推送器。 但我收到以下错误: Pusher.js?b3eb:593 POST http://localhost:8000/broadcasting/auth 404 (未找到) ...

回答 7 投票 0

Vue 2 + Axios - 显示/隐藏 div 作为 Axois 请求结果的结果

我的 html 页面中有一个 div ... isCaptchaError - 在我的 Vue 实例中初始化: const 形式 = 新 Vue({ 电子...

回答 1 投票 0

pnpm patch 成功给项目打补丁,但是项目运行时补丁不生效?

我发现el-form有问题,所以我决定在我的项目中修补element-ui。 [email protected][email protected]、pnpm、element-ui@^2.15.14 我运行了 pnpm patch element-ui@^2.15.14 根目录补丁...

回答 1 投票 0

在浏览器中使用的VueNumberFormat(UMD)

我想在浏览器中使用 VueNumberFormat (vue 2 库)。 我在 html 页面中加载库 <question vote="0"> <p>我想在浏览器中使用 VueNumberFormat (vue 2 库)。</p> <p>我在我的 html 页面中加载库</p> <pre><code>&lt;script src=&#34;https://cdn.jsdelivr.net/npm/vue/dist/vue.min.js&#34;&gt;&lt;/script&gt; &lt;script src=&#34;https://cdn.jsdelivr.net/npm/<a href="/cdn-cgi/l/email-protection" data-cfemail="285e5d4d05465d454a4d5a054e475a45495c6819061b0619">[email protected]</a>/dist/library.js&#34;&gt;&lt;/script&gt; </code></pre> <p>接下来在我的 js 文件中我尝试使用这个库</p> <pre><code>Vue.use(VueNumberFormat, {prefix: &#39;R$ &#39;, decimal: &#39;,&#39;, thousand: &#39;.&#39;}); </code></pre> <p>页面加载后,我在浏览控制台中出现错误</p> <pre><code>library.js:3 Uncaught ReferenceError: require is not defined at library.js:3:11 </code></pre> <p>有什么方法可以在浏览器环境中使用这个或另一个库吗?</p> </question> <answer tick="false" vote="0"> <p>您正在使用的 cdn 链接使用 <pre><code>require</code></pre>,因此使其正常工作可能会很棘手。</p> <p>cdn 包含一个 esm 模块,您可以像这样使用</p> <pre><code>&lt;script type=&#34;module&#34;&gt; import vueNumberFormat from &#39;https://cdn.jsdelivr.net/npm/<a href="/cdn-cgi/l/email-protection" data-cfemail="6b1d1e0e46051e06090e19460d0419060a1f2b5a4558455a">[email protected]</a>/+esm&#39; &lt;/script&gt; </code></pre> <p>但是如果您不熟悉使用 esm 模块,这可能会令人困惑。</p> <p>或者,github存储库包含可以直接使用的umd文件<a href="https://github.com/igortrinidad/vue-number-format/blob/d5345761b21475d489e31ef94411f8dfd0363b13/dist/VueNumberFormat.umd.min.js" rel="nofollow noreferrer">https://github.com/igortrinidad/vue-number-format/blob/d5345761b21475d489e31ef94411f8dfd0363b13/dist/VueNumberFormat.umd.min.js</a> 我找不到为此的 CDN,因此您必须下载此文件并自行托管它或为此找到一些 CDN,或者作为最后的手段将内容包含在脚本标记中</p> <pre><code>&lt;script&gt; (function(e,t){&#34;object&#34;===typeof exports&amp;&amp;&#34;object&#34;===typeof module?module.exports=t(require(&#34;vue&#34;)):&#34;function&#34;===typeof define&amp;&amp;define.amd?define([],t):&#34;object&#34;===typeof exports?exports[&#34;VueNumberFormat&#34;]=t(require(&#34;vue&#34;)):e[&#34;VueNumberFormat&#34;]=t(e[&#34;Vue&#34;])})(&#34;undefined&#34;!==typeof self?self:this,(function(e){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){&#34;undefined&#34;!==typeof Symbol&amp;&amp;Symbol.toStringTag&amp;&amp;Object.defineProperty(e,Symbol.toStringTag,{value:&#34;Module&#34;}),Object.defineProperty(e,&#34;__esModule&#34;,{value:!0})},n.t=function(e,t){if(1&amp;t&amp;&amp;(e=n(e)),8&amp;t)return e;if(4&amp;t&amp;&amp;&#34;object&#34;===typeof e&amp;&amp;e&amp;&amp;e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,&#34;default&#34;,{enumerable:!0,value:e}),2&amp;t&amp;&amp;&#34;string&#34;!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&amp;&amp;e.__esModule?function(){return e[&#34;default&#34;]}:function(){return e};return n.d(t,&#34;a&#34;,t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p=&#34;&#34;,n(n.s=&#34;fb15&#34;)}({&#34;025e&#34;:function(e,t,n){&#34;use strict&#34;;n.d(t,&#34;a&#34;,(function(){return o})),n.d(t,&#34;d&#34;,(function(){return u})),n.d(t,&#34;b&#34;,(function(){return i})),n.d(t,&#34;c&#34;,(function(){return a}));var r=n(&#34;ffd9&#34;);const o=(e=0,t=r[&#34;a&#34;])=&gt;{null===e&amp;&amp;(e=0);const n=Object.assign({},r[&#34;a&#34;],t);&#34;number&#34;!==typeof e||n.isInteger||(e=e.toFixed(s(n.precision)));const o=m(e,n.acceptNegative)?&#34;-&#34;:&#34;&#34;,u=c(e),i=f(u,n.precision),a=d(i).split(&#34;.&#34;);var b=a[0];const v=a[1];return b=p(b,n.thousand),o+n.prefix+l(b,v,n.decimal)+n.suffix},u=(e=0,t={precision:2,isInteger:!1,acceptNegative:!0})=&gt;{null===e&amp;&amp;(e=0);const n=Object.assign({},r[&#34;a&#34;],t);var o=m(e,n.acceptNegative)?-1:1,u=c(e),i=f(u,n.precision);return n.isInteger?parseInt(`${m(e,n.acceptNegative)?&#34;-&#34;:&#34;&#34;}${u.toString()}`):parseFloat(i)*o},i=(e,t)=&gt;{var n=function(){e.setSelectionRange(t,t)};e===document.activeElement&amp;&amp;setTimeout(n,1)},a=(e,t=r[&#34;a&#34;])=&gt;{var n=e.value.length-e.selectionEnd;e.value=o(e.value,t),n=Math.max(n,t.suffix.length),n=e.value.length-n,n=Math.max(n,t.prefix.length+1),i(e,n)};function c(e){return d(e).replace(/\D+/g,&#34;&#34;)||&#34;0&#34;}function s(e){return Math.max(0,Math.min(e,20))}function f(e,t){var n=Math.pow(10,t),r=parseFloat(e)/n;return r.toFixed(s(t))}function p(e,t){return e.replace(/(\d)(?=(?:\d{3})+\b)/gm,&#34;$1&#34;+t)}function l(e,t,n){return t?e+n+t:e}function d(e){return e?e.toString():&#34;&#34;}function m(e,t=!0){if(!t)return!1;&#34;string&#34;!=typeof e&amp;&amp;(e=e.toString());const n=e.indexOf(&#34;+&#34;)&gt;=0,r=0!==e&amp;&amp;e.indexOf(&#34;-&#34;)&gt;=0||&#34;-&#34;==e[e.length-1];return!(n||!r)}},&#34;6b0d&#34;:function(e,t,n){&#34;use strict&#34;;Object.defineProperty(t,&#34;__esModule&#34;,{value:!0}),t.default=(e,t)=&gt;{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n}},&#34;7fb5&#34;:function(e,t,n){&#34;use strict&#34;;var r=n(&#34;8bbf&#34;);const o=[&#34;value&#34;];function u(e,t,n,u,i,a){return Object(r[&#34;openBlock&#34;])(),Object(r[&#34;createElementBlock&#34;])(&#34;input&#34;,{value:a.formattedValue,inputmode:&#34;numeric&#34;,onInput:t[0]||(t[0]=e=&gt;a.onInput(e)),onFocus:t[1]||(t[1]=e=&gt;a.onFocus(e))},null,40,o)}var i=n(&#34;025e&#34;),a=n(&#34;ffd9&#34;),c={name:&#34;VueNumberFormat&#34;,props:{value:{type:[String,Number],default:null},options:{type:Object,default:()=&gt;{}}},emits:[&#34;input&#34;,&#34;update:value&#34;],computed:{mergedOptions(){const e=this.$vueNumberFormatOptions||a[&#34;a&#34;];return this.options?Object.assign({},e,this.options):e},formattedValue(){return Object(i[&#34;a&#34;])(this.value,this.mergedOptions)}},created(){this.$vueNumberFormatOptions||(this.$vueNumberFormatOptions=a[&#34;a&#34;])},methods:{onFocus(e){Object(i[&#34;b&#34;])(e.target,e.target.value.length-this.mergedOptions.suffix.length)},onInput(e){Object(i[&#34;c&#34;])(e.target,this.mergedOptions);const t=Object(i[&#34;d&#34;])(e.target.value,this.mergedOptions);this.updateValue(t)},updateValue(e){this.$vueNumberFormatOptions&amp;&amp;&#34;v2&#34;===this.$vueNumberFormatOptions.vueVersion?this.$emit(&#34;input&#34;,e):this.$emit(&#34;update:value&#34;,e)}}},s=n(&#34;6b0d&#34;),f=n.n(s);const p=f()(c,[[&#34;render&#34;,u]]);t[&#34;a&#34;]=p},&#34;8bbf&#34;:function(t,n){t.exports=e},b635:function(e,t,n){&#34;use strict&#34;;(function(e){var r=n(&#34;7fb5&#34;),o=n(&#34;ffd9&#34;),u=n(&#34;025e&#34;);const i=(e,t)=&gt;{if(i.installed)return;i.installed=!0,e.component(&#34;VueNumberFormat&#34;,r[&#34;a&#34;]);const n=Object.assign({},o[&#34;a&#34;],t);&#34;undefined&#34;!=typeof e.prototype?(n.vueVersion=&#34;v2&#34;,e.prototype.$vueNumberFormatOptions=n):(n.vueVersion=&#34;v3&#34;,e.config.globalProperties.$vueNumberFormatOptions=n),e.mixin({methods:{vueNumberFormat(e,t=n){const r=Object.assign({},n,t);return Object(u[&#34;a&#34;])(e,r)},vueNumberUnformat(e,t=n){const r=Object.assign({},n,t);return Object(u[&#34;d&#34;])(e,r)}}})};Object.assign(r[&#34;a&#34;],{install:i,format:u[&#34;a&#34;],unformat:u[&#34;d&#34;]});let a=null;&#34;undefined&#34;!==typeof window?a=window.Vue:&#34;undefined&#34;!==typeof e&amp;&amp;(a=e.Vue),a&amp;&amp;a.use(r[&#34;a&#34;]),t[&#34;a&#34;]=r[&#34;a&#34;]}).call(this,n(&#34;c8ba&#34;))},c8ba:function(e,t){var n;n=function(){return this}();try{n=n||new Function(&#34;return this&#34;)()}catch(r){&#34;object&#34;===typeof window&amp;&amp;(n=window)}e.exports=n},fb15:function(e,t,n){&#34;use strict&#34;;if(n.r(t),&#34;undefined&#34;!==typeof window){var r=window.document.currentScript,o=r&amp;&amp;r.src.match(/(.+\/)[^/]+\.js(\?.*)?$/);o&amp;&amp;(n.p=o[1])}var u=n(&#34;b635&#34;);t[&#34;default&#34;]=u[&#34;a&#34;]},ffd9:function(e,t,n){&#34;use strict&#34;;t[&#34;a&#34;]={prefix:&#34;R$ &#34;,suffix:&#34;&#34;,decimal:&#34;,&#34;,thousand:&#34;.&#34;,precision:2,acceptNegative:!0,isInteger:!1}}})})); &lt;/script&gt; </code></pre> </answer> </body></html>

回答 0 投票 0

移动端h5页面,ios 17+视频画面显示不全

在此输入图片描述移动端h5页面,ios 17+中视频画面显示有问题。有人遇到过这种情况吗?宽度和高度...

回答 1 投票 0

防止点击背景时模态关闭[Vuejs]

我正在使用 vue-js-modal 库并遵循文档中的相同步骤,但我需要实现当模式打开时用户在单击背景时无法关闭模式

回答 5 投票 0

检查使用vue-router时是否可以前进

我正在使用Vue2和Vue-router(版本^2.2.0)开发一个应用程序,后退和前进导航按钮必须显示用户是否可以后退/前进。 检查用户是否可以...

回答 3 投票 0

如何用Vuejs通过点击改变两个开关数据

请有人教我点击时交换两个不同数据的方法 例如我们有一个数据 数据() { 返回 { 数据一:[ { 名称:“西莫&...

回答 1 投票 0

如何通过 typescript 在 Vue2 中使用带有组合 api 的 vue 类组件

从 'vue-property-decorator' 导入 { Component, Vue } 从 '@/composables/customerRepository' 导入 { CustomerContext, getCustomerRepository } @成分 出口</desc> <question vote="7"> <pre><code>&lt;script lang=&#34;ts&#34;&gt; import { Component, Vue } from &#39;vue-property-decorator&#39; import { CustomerContext, getCustomerRepository } from &#39;@/composables/customerRepository&#39; @Component export default class CustomerList extends Vue { search = &#39;&#39; setup(): CustomerContext { const ctx = getCustomerRepository() return ctx } } &lt;/script&gt; </code></pre> <p>在 Vue 2 中,我想通过 TypeScript 将 Composition API 与类组件样式一起使用,但我不确定语法是否正确。此外,<pre><code>setup()</code></pre>函数不会自动调用。</p> <p><pre><code>vue-class-component</code></pre>可以在 TypeScript 中使用 Compostion API 吗?</p> </question> <answer tick="true" vote="21"> <h3>Vue 2</h3> <p>首先,确保您已经安装了 Vue 2 的 <a href="https://www.npmjs.com/package/@vue/composition-api" rel="noreferrer"><pre><code>@vue/composition-api</code></pre></a> 插件:</p> <pre><code>// main.ts import Vue from &#39;vue&#39; import VueCompositionApi from &#39;@vue/composition-api&#39; Vue.use(VueCompositionApi) </code></pre> <p>然后将 <pre><code>setup()</code></pre> 定义为 <pre><code>@Component</code></pre> 选项(而不是类方法):</p> <pre><code>// MyComponent.vue @Component({ setup(props, context) { //... } }) export default class CustomerList extends Vue { //... } </code></pre> <h3>Vue 3</h3> <p>对于 Vue 3,<pre><code><a href="/cdn-cgi/l/email-protection" data-cfemail="a4d2d1c189c7c8c5d7d789c7cbc9d4cbcac1cad0e49c8adc">[email protected]</a></code></pre> 导出一个 <pre><code>setup()</code></pre> API,您可以将其分配给局部变量:</p> <pre><code>&lt;template&gt; &lt;div&gt;counter: {{myContext.counter}}&lt;/div&gt; &lt;button @click=&#34;myContext.increment&#34;&gt;Increment&lt;/button&gt; &lt;/template&gt; &lt;script lang=&#34;ts&#34;&gt; import { Vue, setup } from &#39;vue-class-component&#39; import { ref } from &#39;vue&#39; export default class MyComponent extends Vue { myContext = setup(() =&gt; { const counter = ref(0) return { counter, increment() { counter.value++ } } }) } &lt;/script&gt; </code></pre> <p><em><strong>注意:</strong> 从 <pre><code><a href="/cdn-cgi/l/email-protection" data-cfemail="f1878494dc929d908282dc929e9c819e9f949f85b1c9dfc1dfc1dc8392dfc0">[email protected]</a></code></pre> 开始,<pre><code>setup()</code></pre> 不接收任何参数,包括来自选项 API<a href="https://v3.vuejs.org/guide/composition-api-setup.html#arguments" rel="noreferrer"> 中使用的 <pre><code>context</code></pre> 的 <pre></pre><code>props</code><pre> 和 </pre><code>setup()</code></a> 参数。</em></p> </answer> <answer tick="false" vote="0"> <p>使用class来编写setup,支持vue2和vue3</p> <pre><code>&lt;template&gt; &lt;p&gt;{{ count.text }}&lt;/p&gt; &lt;/template&gt; &lt;script lang=&#34;ts&#34;&gt; import { defineComponent } from &#39;vue&#39;; import { Setup, Hook } from &#39;vue-class-setup&#39;; @Setup class Count { public value = 0; public get text() { return String(this.value); } @Hook(&#39;mounted&#39;) public init() { this.value++; } } export default defineComponent({ setup() { return { count: new Count() } } }) &lt;/script&gt; </code></pre> <p><a href="https://github.com/fmfe/vue-class-setup" rel="nofollow noreferrer">https://github.com/fmfe/vue-class-setup</a></p> </answer> <answer tick="false" vote="0"> <pre><code>import ClassComponent from &#39;vue-class-component&#39; ClassComponent.registerHooks([&#39;setup&#39;]) </code></pre> <p>将其放在项目的开头,然后一切都会按您的预期进行</p> </answer> </body></html>

回答 0 投票 0

Element UI 日期时间选择器禁用当前时间之前的小时和分钟

我使用的是element-ui 2.15.7。如何禁用当前时间之前的小时和分钟。例如,当前时间是 27/11/2023 1:41 pm,所以我希望日期选择器禁用 0 -> 12 小时(仅 sh...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.