VueJS thêm một thuộc tính có điều kiện cho một phần tử


119

Trong VueJS, chúng ta có thể thêm hoặc xóa một phần tử DOM bằng v-if:

<button v-if="isRequired">Important Button</button>

nhưng có cách nào để thêm / xóa các thuộc tính của một phần tử dom, ví dụ: cho thuộc tính bắt buộc được đặt có điều kiện sau đây không:

Username: <input type="text" name="username" required>

bởi một cái gì đó tương tự như:

Username: <input type="text" name="username" v-if="name.required" required>

Có ý kiến ​​gì không?


4
Trong khi đang không rõ ràng (vì sự nhầm lẫn) các tài liệu thực sự làm nói rằng nếu đánh giá lại giá trị thuộc tính cho thuộc tính sau đó sai bị bỏ qua ( vuejs.org/v2/guide/syntax.html#Attributes )
AlexanderB

Trên thực tế, các tài liệu nói rằng thuộc tính sẽ không được thêm nếu “... có giá trị null, undefinedhoặc false , đó là khác biệt so với một kịch bản JS đánh giá false. Điều này có nghĩa là một chuỗi rỗng là sai trong JavaScript, nhưng vẫn sẽ thêm thuộc tính vào DOM. Để tránh điều đó, bạn có thể thửv-bind:name="name || false"
Denilson Sá Maia

@AlexanderB Nếu điều đó đúng, làm cách nào tôi có thể chuyển rõ ràng falsecho thành phần con thông qua một phần mềm hỗ trợ?
Bruce Sun

@BruceSun, Nếu thuộc tính trong ngữ cảnh "vô tình" biến mất khi bạn cung cấp cho nó giá trị sai - hãy thử chuyển nó dưới dạng một chuỗi 'false'. Trong các trường hợp khác khi bạn cần kiểm soát sự hiện diện của thuộc tính html không boolean trên phần tử, bạn có thể sử dụng kết xuất có điều kiện v-ifnhư được đề xuất tại đây: github.com/vuejs/vue/issues/7552#issuecomment-361395234
AlexanderB

@AlexanderB Tôi nghĩ tôi phải sửa lại bản thân - tôi nên nói attributenhưng KHÔNG prop. Chúng ta có thể chuyển một cách an toàn falsethông qua một thuộc tính thành phần nhưng không phải thuộc tính NOT (không được công nhận là một thuộc tính). Tôi có đúng không?
Bruce Sun

Câu trả lời:


127

Thử:

<input :required="test ? true : false">

9
Hình thức dài là<input v-bind:required="test ? true : false">
nathanielobrown

8
anythingAtAll : ? true : false(hoặc if (condition) { return true; } else { return false; }) bằng ngôn ngữ nào là ... khó coi . Chỉ sử dụng return (condition)hoặc, trong trường hợp này,<input :required="test">
Stephen P

5
nếu bạn chắc chắn rằng biến đó testboolean, bạn chỉ có thể sử dụng:required="test"
strz

2
Xin lưu ý rằng điều này phụ thuộc vào thành phần! Có thể là nếu thuộc tính của bạn chấp nhận Stringgiá trị mà bằng cách đặt nó cho falsebạn sẽ gặp type checklỗi. Vì vậy, hãy đặt nó thành undefinedthay vì false. tài liệu
Traxo

sử dụng :required="required"requiredlà một kết quả bất động sản thành phần Boolean trong <el cần = "yêu cầu"> cho tôi
Andrew Castellano

65

Hình thức đơn giản nhất:

<input :required="test">   // if true
<input :required="!test">  // if false
<input :required="!!test"> // test ? true : false

1
Xin lưu ý rằng điều này phụ thuộc vào thành phần! Có thể là nếu thuộc tính của bạn chấp nhận Stringgiá trị mà bằng cách đặt nó cho falsebạn sẽ gặp type checklỗi. Vì vậy, hãy đặt nó thành undefinedthay vì false. tài liệu
Traxo

@Syed câu trả lời của bạn bằng cách sử dụng dấu chấm than kép !! Tôi chưa bao giờ thấy cú pháp đó trước ngày hôm qua và trong quá trình xem xét mã, tôi đã bắt gặp điều này: - <input :required="!!!recipe.checked" v-model="recipe.pieType"><select :required="!!!recipe.checked" v-model="recipe.ingredients" :options="ingredients"></select> Bạn có biết !!!(3) có nghĩa là gì đối với một :requiredgiá trị không? Cảm ơn.
Chris 22

2
@ Chris22 Không có sự khác biệt giữa! Test và !!! test, vì !!! test chỉ là !! (! Test) và bởi vì! Test là boolean, !! (! Test) chỉ là phủ định kép của nó, do đó tương tự. Kiểm tra cái này: stackoverflow.com/a/25318045/1292050
Syed

@Syed cảm ơn. Theo liên kết của bạn, tôi cũng tìm thấy cái này và tôi đồng ý . : ^)
Chris22

Những gì @Syed nói không phải là sai sự thật
rowon vào

16

<input :required="condition">

Bạn không cần <input :required="test ? true : false">vì nếu thử nghiệmtrung thực, bạn sẽ nhận được requiredthuộc tính và nếu thử nghiệm là giả mạo, bạn sẽ không nhận được thuộc tính. Một true : falsephần là thừa, nhiều như thế này ...

if (condition) {
    return true;
} else {
    return false;
}
// or this...
return condition ? true : false;
// can *always* be replaced by...
return (condition); // parentheses generally not needed

Do đó, cách đơn giản nhất để thực hiện ràng buộc này là <input :required="condition">

Chỉ khi bài kiểm tra (hoặc điều kiện ) có thể bị hiểu sai thì bạn mới cần làm điều gì đó khác; trong trường hợp đó, việc sử dụng Syed !!thực sự là một mẹo nhỏ.
  <input :required="!!condition">


11

Bạn có thể vượt qua booleanbằng cách ép buộc nó, đặt !!trước biến.

let isRequired = '' || null || undefined
<input :required="!!isRequired"> // it will coerce value to respective boolean 

Nhưng tôi muốn thu hút sự chú ý của bạn đối với trường hợp sau đây khi thành phần nhận đã xác định typecho các đạo cụ. Trong trường hợp đó, nếu isRequiredđã xác định kiểu stringthì việc vượt qua booleankhiến việc kiểm tra kiểu không thành công và bạn sẽ nhận được cảnh báo Vue. Để khắc phục điều đó, bạn có thể muốn tránh vượt qua phần hỗ trợ đó, vì vậy chỉ cần đặt undefineddự phòng và phần hỗ trợ sẽ không được gửi đếncomponent

let isValue = false
<any-component
  :my-prop="isValue ? 'Hey I am when the value exist' : undefined"
/>

Giải trình

Tôi đã gặp vấn đề tương tự và đã thử các giải pháp trên !! Có, tôi không thấy propnhưng điều đó thực sự không đáp ứng những gì được yêu cầu ở đây.

Vấn đề của tôi -

let isValid = false
<any-component
  :my-prop="isValue ? 'Hey I am when the value exist': false"
/>

Trong trường hợp trên, những gì tôi mong đợi không my-propđược chuyển đến thành phần con - <any-conponent/>Tôi không thấy proptrong DOMnhưng Trong <any-component/>thành phần của tôi , một lỗi xuất hiện do lỗi kiểm tra kiểu chống đỡ. Như trong thành phần con, tôi đang mong đợi my-proplà một Stringnhưng nó là boolean.

myProp : {
 type: String,
 required: false,
 default: ''
}

Có nghĩa là thành phần con đó đã nhận được chỗ dựa ngay cả khi nó là false. Tinh chỉnh ở đây là để thành phần con thực hiện default-valuevà cũng bỏ qua việc kiểm tra. Đã vượt qua undefinedcông việc mặc dù!

<any-component
  :my-prop="isValue ? 'Hey I am when the value exist' : undefined"
/>
 

Điều này hoạt động và phần mềm hỗ trợ con của tôi đang có giá trị mặc định.


2

Sử dụng html

<input :required="condition" />

Và xác định trong thuộc tính dữ liệu như

data () {
   return {
      condition: false
   }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.