首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Jquery代码转换为StimulusJS控制器Rails 7?

如何将Jquery代码转换为StimulusJS控制器Rails 7?
EN

Stack Overflow用户
提问于 2022-07-01 18:04:46
回答 1查看 278关注 0票数 1

我正在构建一个功能来显示文本字段中的折扣代码是否有效。我刚刚成功地使用Jquery构建了它,但现在我想将它转换为StimulusJS控制器。但我不太确定该怎么做。

我目前对jquery的看法是:

代码语言:javascript
复制
<div class="mt-2 mx-1">
 <label class="block text-sm font-medium text-gray-700">Discount Code</label>
 <div class="mt-1">
  <input type="text" name="discount_code" id="validateCode" class="appearance-none block w- 
  full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 
  focus:outline-none focus:ring-teal-500 focus:border-teal-500 sm:text-sm">
 </div>
</div>

<script>
  $('#validateCode').on("keyup", function(){
    let code = $('#validateCode').val()
    fetch('/choose_plan/validate_discount_code?code=' + code)
    .then(response => response.json())
    .then(data => { if(data.valid)
      { $('#validateCode').css("background-color", "aliceblue") }
    else
      { $('#validateCode').css("background-color", "white") }
    });
  });
</script>

我的validate_discount_controller.js已经开始了:

代码语言:javascript
复制
import { Controller } from "@hotwired/stimulus"

// Connects to data-controller="validate-discount"
export default class extends Controller {
  connect() {
    this.element.addEventListener('change', (e) => {
      // execute a fetch request or something here
    })
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-02 08:50:51

这可以在刺激中完成,但如果你让它起作用,你可能只想继续做其他的事情,如果需要的话,以后再重构。

尽管如此,这里还是详细介绍了如何将您的jQuery转换为普通的JS (即没有库)以及刺激。

一个很好的资源是这个网站- https://youmightnotneedjquery.com/或Mozilla docs https://developer.mozilla.org/

jQuery击穿

示例

代码语言:javascript
复制
<form>
  <div class="mt-2 mx-1">
    <label class="block text-sm font-medium text-gray-700" for="validateCode">Discount Code</label>
    <div class="mt-1">
      <input type="text" name="discount_code" id="validateCode" class="all-the-100-classes"
        data-controller="validate-discount" data-action="validate-discount#validate keyup->validate-discount#validate"
        data-validate-discount-valid-class="bg-error" data-validate-discount-invalid-class="bg-success">
    </div>
  </div>
</form>

注意:我已经包含了一个脱去脚本,因为您可能不想每次击键都调用API --这很可能会给您的用户带来挫折和沉重的负担。您可能需要考虑一种节流阀方法。

代码语言:javascript
复制
import { Controller } from '@hotwired/stimulus';

// https://www.joshwcomeau.com/snippets/javascript/debounce/
const debounce = (callback, wait) => {
  let timeoutId = null;
  return (...args) => {
    window.clearTimeout(timeoutId);
    timeoutId = window.setTimeout(() => {
      callback.apply(null, args);
    }, wait);
  };
};

export default class extends Controller {
  // https://stimulus.hotwired.dev/reference/css-classes
  static classes = ['invalid', 'valid'];

  // https://stimulus.hotwired.dev/reference/values
  static values = {
    endpoint: {
      default: '/choose_plan/validate_discount_code?code=',
      type: String,
    },
  };

  initialize() {
    // this will ensure that the API does not get called too much
    // the wait time (300) is in milliseconds so adjust as needed
    this.validate = debounce(this.validate.bind(this), 300);
  }

  validate() {
    // read the value from the input
    // https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement
    const code = this.element.value;

    fetch('/choose_plan/validate_discount_code?code=' + code)
      .then((response) => response.json())
      .then(({ valid }) => {
        if (valid) {
          this.element.classList.remove(...this.invalidClasses);
          this.element.classList.add(...this.validClasses);
        } else {
          this.element.classList.add(...this.invalidClasses);
          this.element.classList.remove(...this.validClasses);
          this.element.setCustomValidity('Thats incorrect!');
        }

        // https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setCustomValidity
        this.element.reportValidity();
      });
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72833120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档