搜索
首页web前端css教程如何在WordPress主题中构建VUE组件

How to Build Vue Components in a WordPress Theme

想直接看代码?请跳过本节。

本教程基于Vue 2编写,并使用“内联模板”。Vue 3已弃用此功能,但您可以使用替代方法(例如将模板放在script标签中)来实现类似的效果。

几个月前,我正在构建一个WordPress网站,需要一个包含许多高级条件字段的表单。不同的选择需要不同的选项和信息,而我们的客户需要完全控制所有字段1。此外,该表单需要出现在每个页面的多个位置,并具有略微不同的配置。

并且表单的标题实例需要与汉堡菜单互斥,以便打开一个会关闭另一个。

并且表单包含与SEO相关的文本内容。

并且我们希望服务器响应能够呈现一些可爱的动画反馈。

(呼!)

整个过程感觉足够复杂,以至于我不想手动处理所有这些状态。我记得读过Sarah Drasner的文章“用Vue.js替换jQuery:无需构建步骤”,该文章展示了如何用简单的Vue微型应用替换经典的jQuery模式。这似乎是一个不错的起点,但我很快意识到在WordPress的PHP端事情会变得很混乱。

我真正需要的是可重用的组件

PHP → JavaScript

我喜欢Jamstack工具(如Nuxt)的静态优先方法,并希望在这里做类似的事情——从服务器发送完整内容,并在客户端逐步增强。

但是PHP没有内置的方法来处理组件。然而,它支持在其他文件中包含文件2。WordPress有一个名为get_template_partrequire抽象,它相对于主题文件夹运行,并且更容易使用。将代码划分为模板部分是WordPress提供的最接近组件的东西3

另一方面,Vue完全是关于组件的——但它只能在页面加载并运行JavaScript后才能发挥作用。

这种范例结合的秘诀在于鲜为人知的Vue指令inline-template。它强大的功能允许我们使用现有的标记来定义Vue组件。它是从服务器获取静态HTML和在客户端挂载动态DOM元素之间的完美中间地带。

首先,浏览器获取HTML,然后Vue使其发挥作用。由于标记是由WordPress构建的,而不是由浏览器中的Vue构建的,因此组件可以轻松使用网站管理员可以编辑的任何信息。并且,与.vue文件(非常适合构建更多应用程序式的东西)相反,我们可以保持与整个网站相同的关注点分离——PHP中的结构和内容,CSS中的样式以及JavaScript中的功能。

为了展示这一切是如何组合在一起的,我们将为一个食谱博客构建一些功能。首先,我们将添加一种供用户评价食谱的方法。然后,我们将基于该评分构建一个反馈表单。最后,我们将允许用户根据标签和评分过滤食谱。

我们将构建一些共享状态并在同一页面上运行的组件。为了使它们能够很好地协同工作——并方便将来添加其他组件——我们将整个页面作为我们的Vue应用程序,并在其中注册组件。

每个组件都将位于其自己的PHP文件中,并使用get_template_part包含在主题中。

基础工作

将Vue应用于现有页面时,需要考虑一些特殊情况。首先,Vue不希望您在其中加载脚本——如果您这样做,它会向控制台发送不祥的错误。避免此问题的最简单方法是在每个页面的内容周围添加一个包装元素,然后在包装元素外部加载脚本(出于各种原因,这已经是常见模式)。如下所示:

<?php /* header.php */ ?>
<div id="site-wrapper">

<?php /* footer.php */ ?>
</div>
<?php wp_footer(); ?>

第二个考虑因素是Vue必须在body元素的末尾调用,以便它在其余DOM可用解析之后加载。我们将true作为第五个参数(in_footer)传递给wp_enqueue_script函数。此外,为了确保Vue首先加载,我们将它注册为主脚本的依赖项。

<?php // functions.php

add_action( 'wp_enqueue_scripts', function() {
  wp_enqueue_script('vue', get_template_directory_uri() . '/assets/js/lib/vue.js', null, null, true); // 在生产环境中更改为vue.min.js
  wp_enqueue_script('main', get_template_directory_uri() . '/assets/js/main.js', 'vue', null, true);
});

最后,在主脚本中,我们将在site-wrapper元素上初始化Vue。

// main.js

new Vue({
  el: document.getElementById('site-wrapper')
})

星级评分组件

我们的单篇文章模板目前如下所示:

<?php /* single-post.php */ ?>
<?php /* ... 文章内容 */ ?>

我们将注册星级评分组件并添加一些逻辑来管理它:

// main.js

Vue.component('star-rating', {
  data () {
    return {
      rating: 0
    }
  },
  methods: {
    rate (i) { this.rating = i }
  },
  watch: {
    rating (val) {
      // 通过在每次更改时检查它来防止评分超出范围
      if (val > 5) 
        this.rating = 5

      // ... 将保存到localStorage或其他地方的一些逻辑
    }
  }
})

// 确保在注册所有组件后初始化 Vue
new Vue({
  el: document.getElementById('site-wrapper')
})

我们将组件模板写入一个单独的PHP文件中。该组件将包含六个按钮(一个用于未评分,五个带星)。每个按钮将包含一个SVG,其填充为黑色或透明。

<?php /* components/star-rating.php */ ?>
<star-rating inline-template="">
  <div>
    <p>评价食谱:</p>
    <svg v-for="i in 5" :key="i"><path :fill="rating >= i ? 'black' : 'transparent'" d="..."></path></svg>
  </div>
</star-rating>

根据经验,我喜欢为组件的顶部元素提供一个与组件本身相同的类名。这使得在标记和CSS之间进行推理变得容易(例如,<star-rating></star-rating>可以被认为是.star-rating)。

现在我们将它包含在我们的页面模板中。

<?php /* single-post.php */ ?>
<?php /* 文章内容 */ ?>
<?php get_template_part('components/star-rating'); ?>

所有模板内的HTML都是有效的,并且浏览器可以理解,除了<star-rating></star-rating>。我们可以通过使用Vue的is指令来解决这个问题:

<div inline-template="" is="star-rating">...</div>

现在假设最大评分不一定是5,而是可以使用流行的WordPress插件Advanced Custom Fields(为页面、帖子和其他WordPress内容添加自定义字段)由网站编辑器控制。我们只需要将其值注入到我们将调用的组件的prop中,我们将其称为maxRating

<?php // components/star-rating.php

// max_rating 是 ACF 字段的名称
$max_rating = get_field('max_rating');
?>
<div :max-rating="<?= $max_rating ?>" inline-template="" is="star-rating">
  <div>
    <p>评价食谱:</p>
    <svg v-for="i in maxRating" :key="i"><path :fill="rating >= i ? 'black' : 'transparent'" d="..."></path></svg>
  </div>
</div>

在我们的脚本中,让我们注册prop并替换魔术数字5:

// main.js

Vue.component('star-rating', {
  props: {
    maxRating: {
      type: Number,
      default: 5 // 高亮显示
    }
  },
  data () {
    return {
      rating: 0
    }
  },
  methods: {
    rate (i) { this.rating = i }
  },
  watch: {
    rating (val) {
      // 通过在每次更改时检查它来防止评分超出范围
      if (val > maxRating) 
        this.rating = maxRating

      // ... 将保存到localStorage或其他地方的一些逻辑
    }
  }
})

为了保存特定食谱的评分,我们需要传入帖子的ID。同样的想法:

<?php // components/star-rating.php

$max_rating = get_field('max_rating');
$recipe_id = get_the_ID();
?>
<div :max-rating="<?= $max_rating ?>" :recipe-id="<?= $recipe_id ?>" inline-template="" is="star-rating">
  <div>
    <p>评价食谱:</p>
    <svg v-for="i in maxRating" :key="i"><path :fill="rating >= i ? 'black' : 'transparent'" d="..."></path></svg>
  </div>
</div>
// main.js

Vue.component('star-rating', {
  props: {
    maxRating: { 
      // 与之前相同
    },
    recipeId: {
      type: String,
      required: true
    }
  },
  // ...
  watch: {
    rating (val) {
      // 与之前相同

      // 在每次更改时,保存到某个存储
      // 例如 localStorage 或发布到 WP 评论端点
      someKindOfStorageDefinedElsewhere.save(this.recipeId, this.rating)
    }
  },
  mounted () {
    this.rating = someKindOfStorageDefinedElsewhere.load(this.recipeId)    
  }
})

现在我们可以将同一个组件文件包含在存档页面(文章循环)中,而无需任何额外设置:

<?php // archive.php

if (have_posts()): while ( have_posts()): the_post(); ?>
<?php // 摘要、特色图片等,然后:
  get_template_part('components/star-rating'); ?>
<?php endwhile; endif; ?>

...(剩余内容过长,已省略)... 请注意,由于篇幅限制,我无法完整地生成剩余的代码。 但是,根据您提供的文本,我可以继续生成类似的伪原创内容,只要您提供更多输入。 请告诉我您希望我接下来做什么。

以上是如何在WordPress主题中构建VUE组件的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
什么是CSS网格?什么是CSS网格?Apr 30, 2025 pm 03:21 PM

CSS网格是创建复杂,响应式Web布局的强大工具。它简化了设计,提高可访问性并提供了比旧方法更多的控制权。

什么是CSS Flexbox?什么是CSS Flexbox?Apr 30, 2025 pm 03:20 PM

文章讨论了CSS FlexBox,这是一种布局方法,用于有效地对齐和分布响应设计中的空间。它说明了FlexBox用法,将其与CSS网格进行了比较,并详细浏览了浏览器支持。

我们如何使用CSS使网站迅速响应?我们如何使用CSS使网站迅速响应?Apr 30, 2025 pm 03:19 PM

本文讨论了使用CSS创建响应网站的技术,包括视口元标签,灵活的网格,流体媒体,媒体查询和相对单元。它还涵盖了使用CSS网格和Flexbox一起使用,并推荐CSS框架

CSS盒装属性有什么作用?CSS盒装属性有什么作用?Apr 30, 2025 pm 03:18 PM

本文讨论了CSS盒装属性,该属性控制了元素维度的计算方式。它解释了诸如Content-Box,Border-Box和Padding-Box之类的值,以及它们对布局设计和形式对齐的影响。

我们如何使用CSS动画?我们如何使用CSS动画?Apr 30, 2025 pm 03:17 PM

文章讨论使用CSS,关键属性并与JavaScript结合创建动画。主要问题是浏览器兼容性。

我们可以使用CSS向我们的项目添加3D转换吗?我们可以使用CSS向我们的项目添加3D转换吗?Apr 30, 2025 pm 03:16 PM

文章讨论了Web项目的3D转换,关键属性,浏览器兼容性和性能注意事项的讨论。(角色计数:159)

我们如何在CSS中添加梯度?我们如何在CSS中添加梯度?Apr 30, 2025 pm 03:15 PM

文章讨论了使用CSS梯度(线性,径向,重复)来增强网站视觉效果,添加深度,焦点和现代美学。

CSS中的伪元素是什么?CSS中的伪元素是什么?Apr 30, 2025 pm 03:14 PM

文章讨论了CSS中的伪元素,它们在增强HTML样式方面的使用以及与伪级的差异。提供实用的例子。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具